我的第三次提交

master
liu 3 years ago
parent b92968f349
commit 1d1869d3a7

@ -0,0 +1,446 @@
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 50;
objects = {
/* Begin PBXBuildFile section */
1F42884E261AB3990012DE1F /* Blue Light.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F42884D261AB3990012DE1F /* Blue Light.png */; };
1F428853261AB4290012DE1F /* Pink Light.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F428852261AB4290012DE1F /* Pink Light.png */; };
1F428856261AB4310012DE1F /* Green Light.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F428855261AB4310012DE1F /* Green Light.png */; };
1F5593322616D83A00421A6B /* Green.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F5593292616D83900421A6B /* Green.png */; };
1F5593352616D83A00421A6B /* Pink.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F55932C2616D83900421A6B /* Pink.png */; };
1F5593362616D83A00421A6B /* Blue Dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F55932D2616D83900421A6B /* Blue Dark.png */; };
1F5593372616D83A00421A6B /* Green Dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F55932E2616D83900421A6B /* Green Dark.png */; };
1F5593392616D83A00421A6B /* Blue.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F5593302616D83900421A6B /* Blue.png */; };
1F55933A2616D83A00421A6B /* Pink Dark.png in Resources */ = {isa = PBXBuildFile; fileRef = 1F5593312616D83900421A6B /* Pink Dark.png */; };
1F55933E2616EBC500421A6B /* ThemeModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F55933D2616EBC500421A6B /* ThemeModel.swift */; };
1F5593422616F1DA00421A6B /* ThemeData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F5593412616F1DA00421A6B /* ThemeData.swift */; };
1F5593452616F4D700421A6B /* ThemeSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F5593442616F4D700421A6B /* ThemeSettings.swift */; };
1F76271326155D9000596F84 /* FormRowStaticView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F76271226155D9000596F84 /* FormRowStaticView.swift */; };
1F7627162615679700596F84 /* FormRowLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F7627152615679700596F84 /* FormRowLinkView.swift */; };
1F7945F9260B55AB0091A4F8 /* AddTodoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F7945F8260B55AB0091A4F8 /* AddTodoView.swift */; };
1F7EE782260DCFD3002E0627 /* Todo.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = 1F7EE780260DCFD2002E0627 /* Todo.xcdatamodeld */; };
1FD767EC26153D0500672F1E /* SettingsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FD767EB26153D0500672F1E /* SettingsView.swift */; };
1FDD41F52612D47300CE4327 /* EmptyListView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FDD41F42612D47300CE4327 /* EmptyListView.swift */; };
1FEEF45B260755EC00D57B41 /* TodoApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FEEF45A260755EC00D57B41 /* TodoApp.swift */; };
1FEEF45D260755EC00D57B41 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FEEF45C260755EC00D57B41 /* ContentView.swift */; };
1FEEF45F260755ED00D57B41 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1FEEF45E260755ED00D57B41 /* Assets.xcassets */; };
1FEEF462260755ED00D57B41 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1FEEF461260755ED00D57B41 /* Preview Assets.xcassets */; };
1FEEF464260755ED00D57B41 /* Persistence.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1FEEF463260755ED00D57B41 /* Persistence.swift */; };
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
1F42884D261AB3990012DE1F /* Blue Light.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Blue Light.png"; sourceTree = "<group>"; };
1F428852261AB4290012DE1F /* Pink Light.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Pink Light.png"; sourceTree = "<group>"; };
1F428855261AB4310012DE1F /* Green Light.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Green Light.png"; sourceTree = "<group>"; };
1F5593292616D83900421A6B /* Green.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Green.png; sourceTree = "<group>"; };
1F55932C2616D83900421A6B /* Pink.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Pink.png; sourceTree = "<group>"; };
1F55932D2616D83900421A6B /* Blue Dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Blue Dark.png"; sourceTree = "<group>"; };
1F55932E2616D83900421A6B /* Green Dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Green Dark.png"; sourceTree = "<group>"; };
1F5593302616D83900421A6B /* Blue.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = Blue.png; sourceTree = "<group>"; };
1F5593312616D83900421A6B /* Pink Dark.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "Pink Dark.png"; sourceTree = "<group>"; };
1F55933D2616EBC500421A6B /* ThemeModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeModel.swift; sourceTree = "<group>"; };
1F5593412616F1DA00421A6B /* ThemeData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeData.swift; sourceTree = "<group>"; };
1F5593442616F4D700421A6B /* ThemeSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeSettings.swift; sourceTree = "<group>"; };
1F76271226155D9000596F84 /* FormRowStaticView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormRowStaticView.swift; sourceTree = "<group>"; };
1F7627152615679700596F84 /* FormRowLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormRowLinkView.swift; sourceTree = "<group>"; };
1F7945F8260B55AB0091A4F8 /* AddTodoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddTodoView.swift; sourceTree = "<group>"; };
1F7EE781260DCFD3002E0627 /* Todo.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = Todo.xcdatamodel; sourceTree = "<group>"; };
1FD767EB26153D0500672F1E /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
1FDD41F42612D47300CE4327 /* EmptyListView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmptyListView.swift; sourceTree = "<group>"; };
1FEEF457260755EC00D57B41 /* Todo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Todo.app; sourceTree = BUILT_PRODUCTS_DIR; };
1FEEF45A260755EC00D57B41 /* TodoApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TodoApp.swift; sourceTree = "<group>"; };
1FEEF45C260755EC00D57B41 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = "<group>"; };
1FEEF45E260755ED00D57B41 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
1FEEF461260755ED00D57B41 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
1FEEF463260755ED00D57B41 /* Persistence.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Persistence.swift; sourceTree = "<group>"; };
1FEEF468260755ED00D57B41 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
1FEEF454260755EC00D57B41 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
1F5593282616D82400421A6B /* Icons */ = {
isa = PBXGroup;
children = (
1F55932D2616D83900421A6B /* Blue Dark.png */,
1F42884D261AB3990012DE1F /* Blue Light.png */,
1F5593302616D83900421A6B /* Blue.png */,
1F55932E2616D83900421A6B /* Green Dark.png */,
1F428855261AB4310012DE1F /* Green Light.png */,
1F5593292616D83900421A6B /* Green.png */,
1F5593312616D83900421A6B /* Pink Dark.png */,
1F428852261AB4290012DE1F /* Pink Light.png */,
1F55932C2616D83900421A6B /* Pink.png */,
);
path = Icons;
sourceTree = "<group>";
};
1F55933C2616EBB200421A6B /* Theme */ = {
isa = PBXGroup;
children = (
1F55933D2616EBC500421A6B /* ThemeModel.swift */,
1F5593412616F1DA00421A6B /* ThemeData.swift */,
1F5593442616F4D700421A6B /* ThemeSettings.swift */,
);
path = Theme;
sourceTree = "<group>";
};
1FEEF44E260755EC00D57B41 = {
isa = PBXGroup;
children = (
1FEEF459260755EC00D57B41 /* Todo */,
1FEEF458260755EC00D57B41 /* Products */,
);
sourceTree = "<group>";
};
1FEEF458260755EC00D57B41 /* Products */ = {
isa = PBXGroup;
children = (
1FEEF457260755EC00D57B41 /* Todo.app */,
);
name = Products;
sourceTree = "<group>";
};
1FEEF459260755EC00D57B41 /* Todo */ = {
isa = PBXGroup;
children = (
1F55933C2616EBB200421A6B /* Theme */,
1F5593282616D82400421A6B /* Icons */,
1FEEF45A260755EC00D57B41 /* TodoApp.swift */,
1FEEF46F260759BC00D57B41 /* View */,
1FEEF45E260755ED00D57B41 /* Assets.xcassets */,
1FEEF463260755ED00D57B41 /* Persistence.swift */,
1F7EE780260DCFD2002E0627 /* Todo.xcdatamodeld */,
1FEEF468260755ED00D57B41 /* Info.plist */,
1FEEF460260755ED00D57B41 /* Preview Content */,
);
path = Todo;
sourceTree = "<group>";
};
1FEEF460260755ED00D57B41 /* Preview Content */ = {
isa = PBXGroup;
children = (
1FEEF461260755ED00D57B41 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
1FEEF46F260759BC00D57B41 /* View */ = {
isa = PBXGroup;
children = (
1FEEF45C260755EC00D57B41 /* ContentView.swift */,
1F7945F8260B55AB0091A4F8 /* AddTodoView.swift */,
1FDD41F42612D47300CE4327 /* EmptyListView.swift */,
1FD767EB26153D0500672F1E /* SettingsView.swift */,
1F76271226155D9000596F84 /* FormRowStaticView.swift */,
1F7627152615679700596F84 /* FormRowLinkView.swift */,
);
path = View;
sourceTree = "<group>";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
1FEEF456260755EC00D57B41 /* Todo */ = {
isa = PBXNativeTarget;
buildConfigurationList = 1FEEF46B260755ED00D57B41 /* Build configuration list for PBXNativeTarget "Todo" */;
buildPhases = (
1FEEF453260755EC00D57B41 /* Sources */,
1FEEF454260755EC00D57B41 /* Frameworks */,
1FEEF455260755EC00D57B41 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = Todo;
productName = Todo;
productReference = 1FEEF457260755EC00D57B41 /* Todo.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
1FEEF44F260755EC00D57B41 /* Project object */ = {
isa = PBXProject;
attributes = {
LastSwiftUpdateCheck = 1240;
LastUpgradeCheck = 1240;
TargetAttributes = {
1FEEF456260755EC00D57B41 = {
CreatedOnToolsVersion = 12.4;
};
};
};
buildConfigurationList = 1FEEF452260755EC00D57B41 /* Build configuration list for PBXProject "Todo" */;
compatibilityVersion = "Xcode 9.3";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
Base,
);
mainGroup = 1FEEF44E260755EC00D57B41;
productRefGroup = 1FEEF458260755EC00D57B41 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
1FEEF456260755EC00D57B41 /* Todo */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
1FEEF455260755EC00D57B41 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1FEEF462260755ED00D57B41 /* Preview Assets.xcassets in Resources */,
1F5593352616D83A00421A6B /* Pink.png in Resources */,
1F5593372616D83A00421A6B /* Green Dark.png in Resources */,
1F5593322616D83A00421A6B /* Green.png in Resources */,
1F5593392616D83A00421A6B /* Blue.png in Resources */,
1F5593362616D83A00421A6B /* Blue Dark.png in Resources */,
1F42884E261AB3990012DE1F /* Blue Light.png in Resources */,
1F428853261AB4290012DE1F /* Pink Light.png in Resources */,
1F428856261AB4310012DE1F /* Green Light.png in Resources */,
1F55933A2616D83A00421A6B /* Pink Dark.png in Resources */,
1FEEF45F260755ED00D57B41 /* Assets.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
1FEEF453260755EC00D57B41 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
1FD767EC26153D0500672F1E /* SettingsView.swift in Sources */,
1F76271326155D9000596F84 /* FormRowStaticView.swift in Sources */,
1F7627162615679700596F84 /* FormRowLinkView.swift in Sources */,
1F5593422616F1DA00421A6B /* ThemeData.swift in Sources */,
1FEEF464260755ED00D57B41 /* Persistence.swift in Sources */,
1F7EE782260DCFD3002E0627 /* Todo.xcdatamodeld in Sources */,
1F5593452616F4D700421A6B /* ThemeSettings.swift in Sources */,
1FDD41F52612D47300CE4327 /* EmptyListView.swift in Sources */,
1FEEF45D260755EC00D57B41 /* ContentView.swift in Sources */,
1F55933E2616EBC500421A6B /* ThemeModel.swift in Sources */,
1FEEF45B260755EC00D57B41 /* TodoApp.swift in Sources */,
1F7945F9260B55AB0091A4F8 /* AddTodoView.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
1FEEF469260755ED00D57B41 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = dwarf;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
};
name = Debug;
};
1FEEF46A260755ED00D57B41 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.4;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
VALIDATE_PRODUCT = YES;
};
name = Release;
};
1FEEF46C260755ED00D57B41 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"Todo/Preview Content\"";
DEVELOPMENT_TEAM = Z3W45GNWDZ;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Todo/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = cn.liuming.Todo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
1FEEF46D260755ED00D57B41 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_ASSET_PATHS = "\"Todo/Preview Content\"";
DEVELOPMENT_TEAM = Z3W45GNWDZ;
ENABLE_PREVIEWS = YES;
INFOPLIST_FILE = Todo/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
PRODUCT_BUNDLE_IDENTIFIER = cn.liuming.Todo;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
1FEEF452260755EC00D57B41 /* Build configuration list for PBXProject "Todo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1FEEF469260755ED00D57B41 /* Debug */,
1FEEF46A260755ED00D57B41 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
1FEEF46B260755ED00D57B41 /* Build configuration list for PBXNativeTarget "Todo" */ = {
isa = XCConfigurationList;
buildConfigurations = (
1FEEF46C260755ED00D57B41 /* Debug */,
1FEEF46D260755ED00D57B41 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
/* Begin XCVersionGroup section */
1F7EE780260DCFD2002E0627 /* Todo.xcdatamodeld */ = {
isa = XCVersionGroup;
children = (
1F7EE781260DCFD3002E0627 /* Todo.xcdatamodel */,
);
currentVersion = 1F7EE781260DCFD3002E0627 /* Todo.xcdatamodel */;
path = Todo.xcdatamodeld;
sourceTree = "<group>";
versionGroupType = wrapper.xcdatamodel;
};
/* End XCVersionGroup section */
};
rootObject = 1FEEF44F260755EC00D57B41 /* Project object */;
}

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<Workspace
version = "1.0">
<FileRef
location = "self:">
</FileRef>
</Workspace>

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>IDEDidComputeMac32BitWarning</key>
<true/>
</dict>
</plist>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "D737C9AA-AFD6-4D2B-A984-B52ABEAC4A3F"
type = "1"
version = "2.0">
</Bucket>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Todo.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Bucket
uuid = "30E243E7-9A98-4EE1-BA7F-0D97B4BB5CAC"
type = "1"
version = "2.0">
</Bucket>

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>SchemeUserState</key>
<dict>
<key>Todo.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
</dict>
</plist>

@ -0,0 +1,11 @@
{
"colors" : [
{
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,158 @@
{
"images": [
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@2x.png",
"scale": "2x"
},
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@3x.png",
"scale": "3x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@2x.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@3x.png",
"scale": "3x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@3x.png",
"scale": "3x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "icon-57.png",
"scale": "1x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "icon-57@2x.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@2x.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@3x.png",
"scale": "3x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20-ipad.png",
"scale": "1x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20@2x-ipad.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29-ipad.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29@2x-ipad.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40.png",
"scale": "1x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "icon-50.png",
"scale": "1x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "icon-50@2x.png",
"scale": "2x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "icon-72.png",
"scale": "1x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "icon-72@2x.png",
"scale": "2x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76.png",
"scale": "1x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76@2x.png",
"scale": "2x"
},
{
"size": "83.5x83.5",
"idiom": "ipad",
"filename": "icon-83.5@2x.png",
"scale": "2x"
},
{
"size": "1024x1024",
"idiom": "ios-marketing",
"filename": "icon-1024.png",
"scale": "1x"
}
],
"info": {
"version": 1,
"author": "icon.wuruihong.com"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

@ -0,0 +1,56 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF6",
"green" : "0xF1",
"red" : "0xF1"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF6",
"green" : "0xF1",
"red" : "0xF1"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x1E",
"green" : "0x1C",
"red" : "0x1C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,56 @@
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF6",
"green" : "0xF1",
"red" : "0xF1"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF6",
"green" : "0xF1",
"red" : "0xF1"
}
},
"idiom" : "universal"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x00",
"green" : "0x00",
"red" : "0x00"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,6 @@
{
"info" : {
"author" : "xcode",
"version" : 1
}
}

@ -0,0 +1,24 @@
{
"images" : [
{
"filename" : "illustration-1.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

@ -0,0 +1,24 @@
{
"images" : [
{
"filename" : "illustration-2.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="444px" height="512px" viewBox="0 0 444 512" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>画板</title>
<g id="画板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="illustration-02" fill="#878787" fill-rule="nonzero">
<path d="M136.652,136.8 C133.317,134.343 128.619,135.057 126.164,138.394 L111.319,158.563 L106.243,151.591 C103.805,148.243 99.113,147.503 95.763,149.942 C92.414,152.381 91.675,157.074 94.114,160.423 L102.871,172.449 C104.821,175.126 107.962,176.729 111.273,176.738 L111.299,176.738 C114.601,176.738 117.738,175.153 119.696,172.493 L138.248,147.289 C140.702,143.952 139.988,139.256 136.652,136.8 L136.652,136.8 Z" id="路径"></path>
<path d="M136.652,259.827 C133.317,257.37 128.619,258.084 126.164,261.421 L111.319,281.589 L106.243,274.618 C103.804,271.269 99.114,270.529 95.762,272.968 C92.413,275.407 91.674,280.099 94.113,283.448 L102.87,295.476 C104.819,298.152 107.96,299.756 111.271,299.764 C111.28,299.765 111.289,299.765 111.297,299.765 C114.599,299.765 117.737,298.179 119.695,295.519 L138.247,270.316 C140.702,266.979 139.988,262.282 136.652,259.827 L136.652,259.827 Z" id="路径"></path>
<path d="M136.652,377.611 C133.317,375.154 128.619,375.868 126.164,379.205 L111.319,399.373 L106.243,392.402 C103.804,389.054 99.114,388.313 95.762,390.752 C92.413,393.191 91.674,397.883 94.113,401.232 L102.87,413.26 C104.819,415.936 107.96,417.54 111.271,417.548 C111.28,417.549 111.289,417.549 111.297,417.549 C114.599,417.549 117.737,415.963 119.695,413.303 L138.247,388.1 C140.702,384.764 139.988,380.067 136.652,377.611 L136.652,377.611 Z" id="路径"></path>
<path d="M194.027,147.871 L286.743,147.871 C290.886,147.871 294.245,144.513 294.245,140.369 C294.245,136.225 290.886,132.867 286.743,132.867 L194.027,132.867 C189.884,132.867 186.525,136.225 186.525,140.369 C186.525,144.513 189.884,147.871 194.027,147.871 Z" id="路径"></path>
<path d="M194.027,179.212 L240.385,179.212 C244.528,179.212 247.887,175.854 247.887,171.71 C247.887,167.566 244.528,164.208 240.385,164.208 L194.027,164.208 C189.884,164.208 186.525,167.566 186.525,171.71 C186.525,175.854 189.884,179.212 194.027,179.212 Z" id="路径"></path>
<path d="M194.027,268.276 L256.235,268.276 C260.378,268.276 263.737,264.918 263.737,260.774 C263.737,256.63 260.378,253.272 256.235,253.272 L194.027,253.272 C189.884,253.272 186.525,256.63 186.525,260.774 C186.525,264.918 189.884,268.276 194.027,268.276 L194.027,268.276 Z" id="路径"></path>
<path d="M240.385,299.618 C244.528,299.618 247.887,296.26 247.887,292.116 C247.887,287.972 244.528,284.614 240.385,284.614 L194.027,284.614 C189.884,284.614 186.525,287.972 186.525,292.116 C186.525,296.26 189.884,299.618 194.027,299.618 L240.385,299.618 Z" id="路径"></path>
<path d="M145.087,108.047 L87.293,108.047 C76.764,108.047 68.197,116.614 68.197,127.143 L68.197,184.937 C68.197,195.466 76.764,204.033 87.293,204.033 L145.087,204.033 C155.616,204.033 164.183,195.466 164.183,184.937 L164.183,127.143 C164.183,116.614 155.617,108.047 145.087,108.047 Z M149.18,184.937 C149.18,187.193 147.344,189.029 145.088,189.029 L87.294,189.029 C85.038,189.029 83.202,187.194 83.202,184.937 L83.202,127.143 C83.202,124.887 85.038,123.051 87.294,123.051 L145.088,123.051 C147.344,123.051 149.18,124.886 149.18,127.143 L149.18,184.937 Z" id="形状"></path>
<path d="M145.087,228.453 L87.293,228.453 C76.764,228.453 68.197,237.02 68.197,247.549 L68.197,305.343 C68.197,315.872 76.764,324.439 87.293,324.439 L145.087,324.439 C155.616,324.439 164.183,315.872 164.183,305.343 L164.183,247.549 C164.183,237.019 155.617,228.453 145.087,228.453 L145.087,228.453 Z M149.18,305.343 C149.18,307.599 147.344,309.435 145.088,309.435 L87.294,309.435 C85.038,309.435 83.202,307.6 83.202,305.343 L83.202,247.549 C83.202,245.293 85.038,243.457 87.294,243.457 L145.088,243.457 C147.344,243.457 149.18,245.292 149.18,247.549 L149.18,305.343 Z" id="形状"></path>
<path d="M145.087,348.857 L87.293,348.857 C76.764,348.857 68.197,357.424 68.197,367.953 L68.197,425.747 C68.197,436.276 76.764,444.843 87.293,444.843 L145.087,444.843 C155.616,444.843 164.183,436.276 164.183,425.747 L164.183,367.953 C164.183,357.424 155.617,348.857 145.087,348.857 Z M149.18,425.747 C149.18,428.003 147.344,429.839 145.088,429.839 L87.294,429.839 C85.038,429.839 83.202,428.004 83.202,425.747 L83.202,367.953 C83.202,365.697 85.038,363.861 87.294,363.861 L145.088,363.861 C147.344,363.861 149.18,365.696 149.18,367.953 L149.18,425.747 Z" id="形状"></path>
<path d="M431.253,128.318 L419.347,120.778 C413.165,116.862 405.827,115.591 398.689,117.194 C391.55,118.799 385.463,123.088 381.55,129.271 L370.632,146.523 L355.472,170.478 L338.328,197.569 L338.328,84.961 C338.328,77.206 332.019,70.897 324.264,70.897 L270.508,70.897 L270.508,55.894 L342.474,55.894 C348.461,55.894 353.332,60.764 353.332,66.751 L353.332,131.719 C353.332,135.863 356.691,139.221 360.834,139.221 C364.977,139.221 368.336,135.863 368.336,131.719 L368.336,66.751 C368.336,52.492 356.735,40.89 342.475,40.89 L268.957,40.89 C265.885,33.473 258.576,28.239 250.062,28.239 L230.682,28.239 L230.682,20.684 C230.682,9.28 221.403,0 209.997,0 L158.359,0 C146.953,0 137.674,9.28 137.674,20.685 L137.674,28.24 L118.294,28.24 C109.78,28.24 102.471,33.474 99.4,40.891 L25.881,40.891 C11.621,40.891 0.02,52.492 0.02,66.752 L0.02,486.14 C0.02,500.399 11.621,512.001 25.881,512.001 L342.476,512.001 C356.736,512.001 368.337,500.399 368.337,486.14 L368.337,317.932 C368.337,313.788 364.978,310.43 360.835,310.43 C356.692,310.43 353.333,313.788 353.333,317.932 L353.333,486.139 C353.333,492.126 348.462,496.996 342.475,496.996 L25.881,496.996 C19.894,496.996 15.023,492.126 15.023,486.139 L15.023,66.751 C15.023,60.764 19.894,55.894 25.881,55.894 L97.847,55.894 L97.847,70.898 L44.091,70.898 C36.336,70.898 30.027,77.207 30.027,84.962 L30.027,467.929 C30.027,475.684 36.336,481.993 44.091,481.993 L324.265,481.993 C332.02,481.993 338.329,475.684 338.329,467.929 L338.329,326.357 L413.66,207.32 C413.661,207.318 413.663,207.315 413.664,207.313 L428.819,183.366 L439.744,166.103 C447.817,153.344 444.008,136.394 431.253,128.318 Z M401.979,131.833 C405.208,131.105 408.525,131.682 411.32,133.453 L423.226,140.994 C428.994,144.646 430.716,152.31 427.065,158.079 L420.153,169.001 L387.321,148.21 L394.229,137.295 C395.998,134.498 398.75,132.558 401.979,131.833 L401.979,131.833 Z M259.897,422.239 C258.477,424.481 256.887,426.595 255.146,428.574 C252.791,425.416 250.115,422.557 247.172,420.037 L386.959,199.293 L396.972,205.634 L259.897,422.239 Z M208.67,466.98 C208.618,466.962 208.553,466.927 208.528,466.927 C208.523,466.927 208.52,466.928 208.518,466.932 C224.768,399.444 216.857,432.299 219.116,422.917 C228.862,424.546 237.923,430.025 243.885,438.602 C204.163,470.61 209.234,466.467 208.67,466.98 Z M379.298,160.888 L412.13,181.679 L404.994,192.955 L372.162,172.164 L379.298,160.888 Z M112.85,48.854 C112.855,48.762 112.861,48.67 112.863,48.577 C112.864,48.545 112.86,48.514 112.861,48.482 C112.969,45.576 115.361,43.242 118.294,43.242 L139.785,43.242 C146.894,43.242 152.678,37.458 152.678,30.349 L152.678,20.684 C152.678,17.551 155.227,15.003 158.36,15.003 L209.998,15.003 C213.131,15.003 215.68,17.551 215.68,20.684 L215.68,30.349 C215.68,37.458 221.464,43.242 228.573,43.242 L250.064,43.242 C252.997,43.242 255.389,45.575 255.497,48.482 C255.497,48.514 255.494,48.545 255.495,48.577 C255.497,48.668 255.503,48.76 255.508,48.852 L255.508,70.897 L112.85,70.897 L112.85,48.854 Z M45.03,85.901 L323.325,85.901 L323.325,221.278 L244.809,345.35 C242.593,348.851 243.635,353.486 247.136,355.701 C250.622,357.906 255.262,356.89 257.487,353.373 L364.138,184.842 L374.282,191.265 L234.495,412.01 C230.959,410.427 227.231,409.23 223.369,408.452 C224.415,406.032 225.645,403.69 227.065,401.446 L238.727,383.019 C240.943,379.518 239.901,374.884 236.4,372.668 C232.898,370.453 228.264,371.495 226.049,374.996 L214.388,393.422 C210.535,399.507 207.727,406.14 206.04,413.138 C206.04,413.14 206.039,413.141 206.039,413.143 L193.951,463.294 C193.652,464.533 193.513,465.772 193.516,466.99 L45.03,466.99 L45.03,85.901 Z M323.325,466.989 L232.572,466.989 L258.319,446.242 C263.923,441.726 268.719,436.351 272.573,430.264 L323.325,350.066 L323.325,466.989 Z" id="形状"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 8.3 KiB

@ -0,0 +1,24 @@
{
"images" : [
{
"filename" : "illustration-3.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.7 KiB

@ -0,0 +1,24 @@
{
"images" : [
{
"filename" : "illustration-4.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

@ -0,0 +1,24 @@
{
"images" : [
{
"filename" : "illustration-5.svg",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"preserves-vector-representation" : true
}
}

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="512px" height="486px" viewBox="0 0 512 486" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>画板</title>
<g id="画板" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="illustration-05" fill="#878787" fill-rule="nonzero">
<path d="M307.039,160.619 L428.961,160.619 C433.107,160.619 436.467,157.259 436.467,153.113 C436.467,148.968 433.107,145.607 428.961,145.607 L307.039,145.607 C302.893,145.607 299.533,148.967 299.533,153.113 C299.533,157.259 302.893,160.619 307.039,160.619 Z" id="路径"></path>
<path d="M307.039,196.782 L428.961,196.782 C433.107,196.782 436.467,193.422 436.467,189.276 C436.467,185.131 433.107,181.77 428.961,181.77 L307.039,181.77 C302.893,181.77 299.533,185.13 299.533,189.276 C299.533,193.422 302.893,196.782 307.039,196.782 Z" id="路径"></path>
<path d="M307.039,232.945 L428.961,232.945 C433.107,232.945 436.467,229.585 436.467,225.439 C436.467,221.293 433.107,217.933 428.961,217.933 L307.039,217.933 C302.893,217.933 299.533,221.293 299.533,225.439 C299.533,229.585 302.893,232.945 307.039,232.945 Z" id="路径"></path>
<path d="M307.039,269.107 L368,269.107 C372.146,269.107 375.506,265.747 375.506,261.601 C375.506,257.456 372.146,254.095 368,254.095 L307.039,254.095 C302.893,254.095 299.533,257.455 299.533,261.601 C299.533,265.746 302.893,269.107 307.039,269.107 L307.039,269.107 Z" id="路径"></path>
<path d="M477.049,34.315 L338.468,34.315 L335.223,22.17 C331.83,9.478 320.286,0.613 307.148,0.613 L204.852,0.613 C191.714,0.613 180.17,9.478 176.777,22.17 L173.532,34.315 L34.951,34.315 C15.679,34.315 0,49.994 0,69.266 L0,343.812 C0,363.084 15.679,378.763 34.951,378.763 L143.833,378.763 L111.436,454.744 C105.254,469.235 115.882,485.388 131.681,485.388 L149.682,485.388 C159.165,485.388 167.695,479.751 171.414,471.029 L187.868,432.441 L324.133,432.441 L340.587,471.029 C344.307,479.752 352.836,485.388 362.319,485.388 L380.32,485.388 C396.075,485.388 406.763,469.278 400.566,454.745 L390.544,431.241 C388.918,427.429 384.511,425.655 380.696,427.281 C376.883,428.907 375.11,433.316 376.735,437.129 L386.758,460.633 C388.718,465.229 385.375,470.376 380.321,470.376 L362.32,470.376 C358.862,470.376 355.753,468.321 354.397,465.141 L317.566,378.764 L351.849,378.764 L362.958,404.816 C364.584,408.629 368.995,410.402 372.806,408.776 C376.619,407.15 378.392,402.741 376.767,398.928 L368.169,378.764 L477.051,378.764 C496.323,378.764 512.002,363.085 512.002,343.813 L512.002,69.266 C512.002,49.994 496.321,34.315 477.049,34.315 L477.049,34.315 Z M191.28,26.046 C192.92,19.91 198.5,15.625 204.852,15.625 L307.148,15.625 C313.499,15.625 319.08,19.91 320.72,26.046 L322.93,34.316 L189.071,34.316 L191.28,26.046 Z M157.604,465.141 C156.248,468.321 153.139,470.376 149.681,470.376 L131.68,470.376 C126.684,470.376 123.259,465.282 125.243,460.633 L160.152,378.764 L194.435,378.764 L157.604,465.141 Z M317.731,417.429 L194.269,417.429 L210.756,378.764 L301.245,378.764 L317.731,417.429 Z M496.989,343.812 C496.989,354.807 488.044,363.752 477.049,363.752 C426.875,363.752 80.048,363.752 34.951,363.752 C23.956,363.752 15.011,354.807 15.011,343.812 L15.011,69.266 C15.011,58.271 23.956,49.326 34.951,49.326 L332.676,49.326 C332.684,49.326 332.692,49.326 332.7,49.326 C332.71,49.326 332.72,49.326 332.73,49.326 L477.049,49.326 C488.044,49.326 496.989,58.271 496.989,69.266 L496.989,343.812 Z" id="形状"></path>
<path d="M463.382,67.34 L48.618,67.34 C40.02,67.34 33.025,74.335 33.025,82.933 L33.025,189.002 C33.025,193.147 36.385,196.508 40.531,196.508 C44.677,196.508 48.037,193.148 48.037,189.002 L48.037,82.933 C48.037,82.612 48.298,82.352 48.618,82.352 L463.382,82.352 C463.703,82.352 463.963,82.613 463.963,82.933 L463.963,330.146 C463.963,330.467 463.702,330.727 463.382,330.727 L48.618,330.727 C48.297,330.727 48.037,330.466 48.037,330.146 L48.037,224.088 C48.037,219.943 44.677,216.582 40.531,216.582 C36.385,216.582 33.025,219.942 33.025,224.088 L33.025,330.146 C33.025,338.744 40.02,345.739 48.618,345.739 L463.382,345.739 C471.98,345.739 478.975,338.744 478.975,330.146 L478.975,82.933 C478.975,74.335 471.981,67.34 463.382,67.34 Z" id="路径"></path>
<path d="M251.058,201.28 C257.432,201.28 262.574,195.934 262.235,189.537 C260.095,148.963 227.884,116.754 187.311,114.613 C184.271,114.46 181.271,115.564 179.063,117.659 C176.843,119.766 175.568,122.73 175.568,125.791 L175.568,190.094 C175.568,196.262 180.586,201.281 186.755,201.281 L251.058,201.281 L251.058,201.28 Z M190.579,129.944 C220.189,133.362 243.485,156.658 246.904,186.268 L190.579,186.268 L190.579,129.944 Z" id="形状"></path>
<path d="M161.34,143.295 C158.848,140.973 155.465,139.787 152.074,140.021 C109.821,143.017 77.506,178.588 78.505,221 C78.984,241.351 87.246,260.557 101.769,275.08 C116.292,289.603 135.498,297.865 155.848,298.344 C156.489,298.359 157.128,298.366 157.766,298.366 C178.285,298.366 197.656,290.594 212.525,276.364 C212.573,276.32 212.625,276.281 212.672,276.236 C226.871,262.588 235.451,244.298 236.831,224.738 C237.332,217.639 231.672,211.587 224.546,211.587 L165.262,211.587 L165.262,152.305 C165.262,148.901 163.832,145.616 161.34,143.295 L161.34,143.295 Z M156.201,283.336 C139.726,282.949 124.164,276.246 112.383,264.465 C100.602,252.683 93.9,237.122 93.512,220.646 C92.725,187.232 117.431,159.057 150.25,155.263 L150.25,219.092 C150.25,220.923 150.97,222.864 152.343,224.293 L196.557,270.301 C185.012,279.096 170.923,283.679 156.201,283.336 L156.201,283.336 Z M207.379,259.898 L194.004,245.981 L175.378,226.599 L221.583,226.599 C220.153,238.857 215.215,250.389 207.379,259.898 L207.379,259.898 Z" id="形状"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.7 KiB

@ -0,0 +1,89 @@
{
"images" : [
{
"filename" : "todo-logo.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"filename" : "todo-logo-1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "todo-logo-dark.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"filename" : "todo-logo@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"filename" : "todo-logo@2x-1.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "todo-logo-dark@2x.png",
"idiom" : "universal",
"scale" : "2x"
},
{
"filename" : "todo-logo@3x.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "light"
}
],
"filename" : "todo-logo@3x-1.png",
"idiom" : "universal",
"scale" : "3x"
},
{
"appearances" : [
{
"appearance" : "luminosity",
"value" : "dark"
}
],
"filename" : "todo-logo-dark@3x.png",
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

@ -0,0 +1,144 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleIcons</key>
<dict>
<key>CFBundlePrimaryIcon</key>
<dict>
<key>CFBundleIconName</key>
<string>Blue</string>
<key>CFBundleIconFiles</key>
<array>
<string>Blue</string>
</array>
<key>UIPrerenderedIcon</key>
<false/>
</dict>
<key>CFBundleAlternateIcons</key>
<dict>
<key>Blue Light</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Blue Light</string>
</array>
</dict>
<key>Blue Dark</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Blue Dark</string>
</array>
</dict>
<key>Green Light</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Green Light</string>
</array>
</dict>
<key>Green Dark</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Green Dark</string>
</array>
</dict>
<key>Green</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Green</string>
</array>
</dict>
<key>Pink Light</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Pink Light</string>
</array>
</dict>
<key>Pink Dark</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Pink Dark</string>
</array>
</dict>
<key>Pink</key>
<dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleIconFiles</key>
<array>
<string>Pink</string>
</array>
</dict>
</dict>
</dict>
<key>UIPrerenderedIcon</key>
<false/>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>$(PRODUCT_NAME)</string>
<key>CFBundlePackageType</key>
<string>$(PRODUCT_BUNDLE_PACKAGE_TYPE)</string>
<key>CFBundleShortVersionString</key>
<string>1.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
</dict>
<key>UIApplicationSupportsIndirectInputEvents</key>
<true/>
<key>UILaunchScreen</key>
<dict>
<key>UIImageName</key>
<string>todo-logo</string>
</dict>
<key>UIRequiredDeviceCapabilities</key>
<array>
<string>armv7</string>
</array>
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
<key>UISupportedInterfaceOrientations~ipad</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array>
</dict>
</plist>

@ -0,0 +1,51 @@
//
// Persistence.swift
// Todo
//
// Created by on 2021/3/21.
//
import CoreData
struct PersistenceController {
static let shared = PersistenceController()
static var preview: PersistenceController = {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
do {
try viewContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nsError = error as NSError
fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
}
return result
}()
let container: NSPersistentContainer
init(inMemory: Bool = false) {
container = NSPersistentContainer(name: "Todo")
if inMemory {
container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
}
container.loadPersistentStores(completionHandler: { (storeDescription, error) in
if let error = error as NSError? {
// Replace this implementation with code to handle the error appropriately.
// fatalError() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
/*
Typical reasons for an error here include:
* The parent directory does not exist, cannot be created, or disallows writing.
* The persistent store is not accessible, due to permissions or data protection when the device is locked.
* The device is out of space.
* The store could not be migrated to the current model version.
Check the error message to determine what the actual problem was.
*/
fatalError("Unresolved error \(error), \(error.userInfo)")
}
})
}
}

@ -0,0 +1,15 @@
//
// ThemeData.swift
// Todo
//
// Created by on 2021/4/2.
//
import SwiftUI
//MARK: - Theme Data
let themeData: [Theme] = [
Theme(id: 0, themeName: "粉色主题", themeColor: Color.pink),
Theme(id: 1, themeName: "蓝色主题", themeColor: Color.blue),
Theme(id: 2, themeName: "绿色主题", themeColor: Color.green)
]

@ -0,0 +1,15 @@
//
// ThemeModel.swift
// Todo
//
// Created by on 2021/4/2.
//
import SwiftUI
//MARK: - Theme Model
struct Theme: Identifiable {
let id: Int
let themeName: String
let themeColor: Color
}

@ -0,0 +1,20 @@
//
// ThemeSettings.swift
// Todo
//
// Created by on 2021/4/2.
//
import SwiftUI
//MARK: - Theme Settings
class ThemeSettings: ObservableObject {
@Published var themeSettings: Int = UserDefaults.standard.integer(forKey: "Theme") {
didSet {
UserDefaults.standard.set(self.themeSettings, forKey: "Theme")
}
}
public static let shared = ThemeSettings()
}

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>_XCCurrentVersionName</key>
<string>Todo.xcdatamodel</string>
</dict>
</plist>

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<model type="com.apple.IDECoreDataModeler.DataModel" documentVersion="1.0" lastSavedToolsVersion="17709" systemVersion="20D91" minimumToolsVersion="Automatic" sourceLanguage="Swift" userDefinedModelVersionIdentifier="">
<entity name="E_Todo" representedClassName="E_Todo" syncable="YES" codeGenerationType="class">
<attribute name="id" optional="YES" attributeType="UUID" usesScalarValueType="NO"/>
<attribute name="name" optional="YES" attributeType="String"/>
<attribute name="priority" optional="YES" attributeType="String"/>
</entity>
<elements>
<element name="E_Todo" positionX="-11828.92626953125" positionY="-18855.93243408203" width="128" height="88"/>
</elements>
</model>

@ -0,0 +1,48 @@
//
// TodoApp.swift
// Todo
//
// Created by on 2021/3/21.
//
import SwiftUI
@main
struct TodoApp: App {
let persistenceController = PersistenceController.shared
var body: some Scene {
WindowGroup {
ContentView()
.environment(\.managedObjectContext, persistenceController.container.viewContext)
.environmentObject(IconNames())
}
}
}
// MARK: - Alternate Icons
class IconNames: ObservableObject {
var iconNames: [String?] = [nil]
@Published var currentIndex = 0
init() {
getAlternateIconNames()
if let currentIcon = UIApplication.shared.alternateIconName {
self.currentIndex = iconNames.firstIndex(of: currentIcon) ?? 0
}
}
func getAlternateIconNames() {
if let icons = Bundle.main.object(forInfoDictionaryKey: "CFBundleIcons") as? [String: Any],
let alternateIcons = icons["CFBundleAlternateIcons"] as? [String: Any] {
for (_, value) in alternateIcons {
guard let iconList = value as? Dictionary<String, Any> else { return }
guard let iconFiles = iconList["CFBundleIconFiles"] as? [String] else { return }
guard let icon = iconFiles.first else { return }
iconNames.append(icon)
}
}
}
}

@ -0,0 +1,105 @@
//
// AddTodoView.swift
// Todo
//
// Created by on 2021/3/24.
//
import SwiftUI
struct AddTodoView: View {
// MARK: - Properties
@Environment(\.managedObjectContext) var managedObjectContext
@Environment(\.presentationMode) var presentationMode
@State private var name = ""
@State private var priority = "标准"
@State private var errorShowing = false
@State private var errorTitle = ""
@State private var errorMessage = ""
// Theme
@ObservedObject var theme = ThemeSettings.shared
var themes: [Theme] = themeData
let priorities = ["", "标准", ""]
// MARK: - Body
var body: some View {
NavigationView {
VStack {
VStack(alignment: .leading, spacing: 20) {
//MARK: - Todo Name
TextField("待办事项", text: $name)
.padding()
.background(Color(UIColor.tertiarySystemFill))
.cornerRadius(9)
.font(.system(size: 24, weight: .bold, design: .default))
//MARK: -
Picker("优先级", selection: $priority) {
ForEach(priorities, id: \.self) {
Text($0)
}
}
.pickerStyle(SegmentedPickerStyle())
//MARK: -
Button(action: {
//print("")
if self.name != "" {
let todo = E_Todo(context: self.managedObjectContext)
todo.name = self.name
todo.priority = self.priority
do {
try self.managedObjectContext.save()
print("新的待办事项:\(todo.name ?? ""), \(todo.priority ?? "")")
} catch {
print(error)
}
} else {
self.errorShowing = true
self.errorTitle = "无效的名称"
self.errorMessage = "请确保你输入的内容是\n待办事项必须的。"
return
}
self.presentationMode.wrappedValue.dismiss()
}, label: {
Text("保存")
.font(.system(size: 24, weight: .bold, design: .default))
.padding()
.frame(minWidth: 0, maxWidth: .infinity)
.background(themes[self.theme.themeSettings].themeColor)
.cornerRadius(9)
.foregroundColor(.white)
}) //:
Spacer()
} //: VStack
.padding(.horizontal)
.padding(.vertical, 30)
} //: VStack
.navigationBarTitle("新的任务", displayMode: .inline)
.navigationBarItems(trailing:
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}, label: {
Image(systemName: "xmark")
})
)
.alert(isPresented: $errorShowing) {
Alert(title: Text(errorTitle), message: Text(errorMessage), dismissButton: .default(Text("确认")))
}
} //: Navigation
.accentColor(themes[self.theme.themeSettings].themeColor)
}
}
// MARK: - Preview
struct AddTodoView_Previews: PreviewProvider {
static var previews: some View {
AddTodoView()
}
}

@ -0,0 +1,153 @@
//
// ContentView.swift
// Todo
//
// Created by on 2021/3/21.
//
import SwiftUI
struct ContentView: View {
//MARK: - Properties
@Environment(\.managedObjectContext) var managedObjectContext
@FetchRequest(entity: E_Todo.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \E_Todo.name, ascending: true)]) var todos: FetchedResults<E_Todo>
@EnvironmentObject var iconSettings: IconNames
@State private var showingAddTodoView = false
@State private var animatingButton = false
@State private var showingSettingsView = false
// Theme
@ObservedObject var theme = ThemeSettings.shared
var themes: [Theme] = themeData
//MARK: - Body
var body: some View {
NavigationView {
ZStack {
List {
ForEach(self.todos, id:\.self) { todo in
HStack {
Circle()
.frame(width: 12, height: 12, alignment: .center)
.foregroundColor(self.colorize(priority: todo.priority ?? "标准"))
Text(todo.name ?? "未知")
.fontWeight(.semibold)
Spacer()
Text(todo.priority ?? "未知")
.font(.footnote)
.foregroundColor(Color(UIColor.systemGray2))
.padding(3)
.frame(minWidth: 62)
.overlay(
Capsule().stroke(Color(UIColor.systemGray2), lineWidth: 0.75)
)
} //: HStack
.padding(.vertical, 10)
} //: Loop
.onDelete(perform: deleteTodo)
} //: List
.navigationBarTitle("待办事项", displayMode: .inline)
.listStyle(PlainListStyle())
.navigationBarItems(
leading: EditButton()/*.accentColor(themes[self.theme.themeSettings].themeColor)*/,
trailing:
Button(action: {
self.showingSettingsView.toggle()
}, label: {
Image(systemName: "paintbrush")
}) //: Button
//.accentColor(themes[self.theme.themeSettings].themeColor)
.sheet(isPresented: $showingSettingsView, content: {
SettingsView().environmentObject(self.iconSettings)
})
)
// MARK: -
if todos.count == 0 {
EmptyListView()
} //: Ifend
} //: ZStack
.sheet(isPresented: $showingAddTodoView, content: {
AddTodoView().environment(\.managedObjectContext, self.managedObjectContext)
})
.overlay(
ZStack {
Group {
Circle()
.fill(themes[self.theme.themeSettings].themeColor)
.opacity(animatingButton ? 0.2 : 0)
.scaleEffect(animatingButton ? 1 : 0)
.frame(width: 68, height: 68, alignment: .center)
Circle()
.fill(themes[self.theme.themeSettings].themeColor)
.opacity(self.animatingButton ? 0.15 : 0)
.scaleEffect(self.animatingButton ? 1 : 0)
.frame(width: 88, height: 88, alignment: .center)
}
.animation(Animation.easeInOut(duration: 2).repeatForever(autoreverses: true), value: animatingButton)
Button(action: {
self.showingAddTodoView.toggle()
}, label: {
Image(systemName: "plus.circle.fill")
.resizable()
.scaledToFit()
.background(Circle().fill(Color("ColorBase")))
.frame(width: 48, height: 48, alignment: .center)
})
.accentColor(themes[self.theme.themeSettings].themeColor)
.onAppear{
animatingButton.toggle()
}
} //: ZStack
.padding(.bottom, 15)
.padding(.trailing, 15)
,alignment: .bottomTrailing
)
} //: Navigation
}
// MARK: - Functions
private func deleteTodo(at offsets: IndexSet) {
for index in offsets {
let todo = todos[index]
managedObjectContext.delete(todo)
do {
try managedObjectContext.save()
} catch {
print(error)
}
} //: Loop
}
private func colorize(priority: String) -> Color {
switch priority {
case "":
return .pink
case "标准":
return .green
case "":
return .blue
default:
return .gray
}
}
}
//MARK: - Preview
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
let context = PersistenceController.shared.container.viewContext
ContentView()
.environment(\.managedObjectContext, context)
}
}

@ -0,0 +1,71 @@
//
// EmptyListView.swift
// Todo
//
// Created by on 2021/3/30.
//
import SwiftUI
struct EmptyListView: View {
//MARK: - Properties
@State private var isAnimated = false
let images: [String] = [
"illustration-1",
"illustration-2",
"illustration-3",
"illustration-4",
"illustration-5",
]
let tips: [String] = [
"更好地利用你的时间",
"放慢你的工作节奏,效果更佳",
"始终保持你的甜美和简捷",
"努力工作是第一要务",
"适当的放纵对自身更健康",
"吾日三省吾身"
]
// Theme
@ObservedObject var theme = ThemeSettings.shared
var themes: [Theme] = themeData
//MARK: - Body
var body: some View {
ZStack {
VStack(alignment: .center, spacing: 20) {
Image("\(images.randomElement() ?? images[0])")
.renderingMode(.template)
.resizable()
.scaledToFit()
.frame(minWidth: 256, idealWidth: 280, maxWidth: 360, minHeight: 256, idealHeight: 280, maxHeight: 360, alignment: .center)
.layoutPriority(1)
.foregroundColor(themes[theme.themeSettings].themeColor)
Text("\(tips.randomElement() ?? tips[0])")
.layoutPriority(0.5)
.font(.headline)
.foregroundColor(themes[theme.themeSettings].themeColor)
} //: VStack
.padding(.horizontal)
.opacity(isAnimated ? 1 : 0)
.offset(y: isAnimated ? 0 : -50)
.animation(Animation.easeIn(duration: 1.5), value: isAnimated)
.onAppear{
isAnimated.toggle()
}
} //: ZStack
.frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity)
.background(Color("ColorBase"))
.edgesIgnoringSafeArea(.all)
}
}
//MARK: - Preview
struct EmptyListView_Previews: PreviewProvider {
static var previews: some View {
EmptyListView()
}
}

@ -0,0 +1,52 @@
//
// FormRowLinkView.swift
// Todo
//
// Created by on 2021/4/1.
//
import SwiftUI
struct FormRowLinkView: View {
//MARK: - Properties
var icon: String
var color: Color
var text: String
var link: String
//MARK: - Body
var body: some View {
HStack {
ZStack {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.fill(color)
Image(systemName: icon)
.imageScale(.large)
.foregroundColor(.white)
} //: ZStack
.frame(width: 36, height: 36, alignment: .center)
Text(text).foregroundColor(.gray)
Spacer()
Button(action: {
//
guard let url = URL(string: self.link), UIApplication.shared.canOpenURL(url) else {
return
}
UIApplication.shared.open(url as URL)
}, label: {
Image(systemName: "chevron.right")
.font(.system(size: 14, weight: .semibold, design: .rounded))
})
} //: HStack
}
}
//MARK: - Preview
struct FormRowLinkView_Previews: PreviewProvider {
static var previews: some View {
FormRowLinkView(icon: "globe", color: Color.pink, text: "网址", link: "www.baidu.com")
.previewLayout(.fixed(width: 375, height: 60))
.padding()
}
}

@ -0,0 +1,45 @@
//
// FormRowStaticView.swift
// Todo
//
// Created by on 2021/4/1.
//
import SwiftUI
struct FormRowStaticView: View {
//MARK: - Properties
var icon: String
var firstText: String
var secondText: String
//MARK: - Body
var body: some View {
HStack {
ZStack {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.fill(Color.gray)
Image(systemName: icon)
.foregroundColor(.white)
} //: ZStack
.frame(width: 36, height: 36, alignment: .center)
Text(firstText).foregroundColor(.gray)
Spacer()
Text(secondText)
} //: HStack
}
}
//MARK: - Preview
struct FormRowStaticView_Previews: PreviewProvider {
static var previews: some View {
FormRowStaticView(
icon: "gear",
firstText: "应用程序",
secondText: "待办事项"
)
.previewLayout(.fixed(width: 375, height: 60))
.padding()
}
}

@ -0,0 +1,149 @@
//
// SettingsView.swift
// Todo
//
// Created by on 2021/4/1.
//
import SwiftUI
struct SettingsView: View {
//MARK: - Properties
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var iconSettings: IconNames
//
let themes: [Theme] = themeData
@ObservedObject var theme = ThemeSettings.shared
@State private var isThemeChanged = false
//MARK: - Body
var body: some View {
NavigationView {
VStack(alignment:.center, spacing:0) {
Form {
// MARK: -
Section(header: Text("选择应用程序图标")) {
Picker(selection: $iconSettings.currentIndex, label:
HStack {
ZStack {
RoundedRectangle(cornerRadius: 8, style: .continuous)
.strokeBorder(Color.primary, lineWidth: 2)
Image(systemName: "paintbrush")
.font(.system(size: 28, weight: .regular, design: .default))
.foregroundColor(.primary)
} //: ZStack
.frame(width: 44, height: 44)
Text("应用程序图标")
.fontWeight(.bold)
.foregroundColor(.primary)
} //: HStack
) {
ForEach(0..<iconSettings.iconNames.count) { index in
HStack {
Image(uiImage:
UIImage(named: self.iconSettings.iconNames[index] ?? "Blue") ?? UIImage())
.renderingMode(.original)
.resizable()
.scaledToFit()
.frame(width: 44, height: 44)
.cornerRadius(3)
Spacer().frame(width: 8)
Text(self.iconSettings.iconNames[index] ?? "Blue")
.frame(alignment: .leading)
} //: HStack
} //: Loop
} //: Picker
.onReceive([self.iconSettings.currentIndex].publisher.first()) { value in
let index = self.iconSettings.iconNames.firstIndex(of: UIApplication.shared.alternateIconName) ?? 0
if index != value {
UIApplication.shared.setAlternateIconName(self.iconSettings.iconNames[value]) { (error) in
if let error = error {
print(error.localizedDescription)
}else {
print("您成功修改了应用程序图标。")
} //: Ifend
}
} //: Ifend
} //: onReceive
}
//MARK: -
Section(
header:
HStack {
Text("选择应用程序的配色主题")
Image(systemName: "circle.fill")
.resizable()
.frame(width: 10, height: 10)
.foregroundColor(themes[self.theme.themeSettings].themeColor)
}
) {
List(themes) { item in
Button(action: {
self.theme.themeSettings = item.id
self.isThemeChanged.toggle()
}, label: {
HStack {
Image(systemName: "circle.fill")
.foregroundColor(item.themeColor)
Text(item.themeName)
} //: HStack
})
.accentColor(Color.primary)
}
}
.padding(.vertical, 3)
.alert(isPresented: $isThemeChanged, content: {
Alert(
title: Text("成功!"),
message: Text("应用程序的颜色主题已经被修改为\n\(self.themes[theme.themeSettings].themeName)"),
dismissButton: .default(Text("OK")))
})
//MARK: -
Section(header: Text("欢迎关注以下社交媒体")) {
FormRowLinkView(icon: "globe", color: .pink, text: "网址", link: "https://www.baidu.com")
FormRowLinkView(icon: "link", color: .blue, text: "微博", link: "https://www.baidu.com")
FormRowLinkView(icon: "play.rectangle", color: .green, text: "微信", link: "https://www.baidu.com")
}
.padding(.vertical, 3)
//MARK: -
Section(header: Text("关于应用程序")) {
FormRowStaticView(icon: "gear", firstText: "应用程序", secondText: "待办事项")
FormRowStaticView(icon: "checkmark.seal", firstText: "兼容性", secondText: "iPhone, iPad")
FormRowStaticView(icon: "keyboard", firstText: "开发人员", secondText: "liuming/ Happy")
FormRowStaticView(icon: "paintbrush", firstText: "设计人员", secondText: "Oscar")
FormRowStaticView(icon: "flag", firstText: "版本", secondText: "1.0.0")
}
.padding(.vertical, 3)
} //: Form
} //: VStack
.navigationBarItems(trailing:
Button(action: {
self.presentationMode.wrappedValue.dismiss()
}, label: {
Image(systemName: "xmark")
})
)
.navigationBarTitle("设置", displayMode: .inline)
.background(Color("ColorBackground"))
.edgesIgnoringSafeArea(.all)
} //: Navigation
.accentColor(themes[self.theme.themeSettings].themeColor)
}
}
//MARK: - Preview
struct SettingsView_Previews: PreviewProvider {
static var previews: some View {
SettingsView().environmentObject(IconNames())
}
}

@ -0,0 +1,158 @@
{
"images": [
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@2x.png",
"scale": "2x"
},
{
"size": "20x20",
"idiom": "iphone",
"filename": "icon-20@3x.png",
"scale": "3x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@2x.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "iphone",
"filename": "icon-29@3x.png",
"scale": "3x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "iphone",
"filename": "icon-40@3x.png",
"scale": "3x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "icon-57.png",
"scale": "1x"
},
{
"size": "57x57",
"idiom": "iphone",
"filename": "icon-57@2x.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@2x.png",
"scale": "2x"
},
{
"size": "60x60",
"idiom": "iphone",
"filename": "icon-60@3x.png",
"scale": "3x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20-ipad.png",
"scale": "1x"
},
{
"size": "20x20",
"idiom": "ipad",
"filename": "icon-20@2x-ipad.png",
"scale": "2x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29-ipad.png",
"scale": "1x"
},
{
"size": "29x29",
"idiom": "ipad",
"filename": "icon-29@2x-ipad.png",
"scale": "2x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40.png",
"scale": "1x"
},
{
"size": "40x40",
"idiom": "ipad",
"filename": "icon-40@2x.png",
"scale": "2x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "icon-50.png",
"scale": "1x"
},
{
"size": "50x50",
"idiom": "ipad",
"filename": "icon-50@2x.png",
"scale": "2x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "icon-72.png",
"scale": "1x"
},
{
"size": "72x72",
"idiom": "ipad",
"filename": "icon-72@2x.png",
"scale": "2x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76.png",
"scale": "1x"
},
{
"size": "76x76",
"idiom": "ipad",
"filename": "icon-76@2x.png",
"scale": "2x"
},
{
"size": "83.5x83.5",
"idiom": "ipad",
"filename": "icon-83.5@2x.png",
"scale": "2x"
},
{
"size": "1024x1024",
"idiom": "ios-marketing",
"filename": "icon-1024.png",
"scale": "1x"
}
],
"info": {
"version": 1,
"author": "icon.wuruihong.com"
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save