commit 98116f3a36afb25ebabf30196998e78197633fe2 Author: cc Date: Tue Jul 1 11:41:38 2025 +0800 Initial Commit diff --git a/IOS_study.xcodeproj/project.pbxproj b/IOS_study.xcodeproj/project.pbxproj new file mode 100644 index 0000000..89ec4b0 --- /dev/null +++ b/IOS_study.xcodeproj/project.pbxproj @@ -0,0 +1,491 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 77; + objects = { + +/* Begin PBXBuildFile section */ + 94790B4C2E1179A600BF0A09 /* CJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B342E1179A600BF0A09 /* CJob.swift */; }; + 94790B4D2E1179A600BF0A09 /* CUser.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B352E1179A600BF0A09 /* CUser.swift */; }; + 94790B4E2E1179A600BF0A09 /* GView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B362E1179A600BF0A09 /* GView.swift */; }; + 94790B4F2E1179A600BF0A09 /* View+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B382E1179A600BF0A09 /* View+.swift */; }; + 94790B502E1179A600BF0A09 /* View+Label.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B392E1179A600BF0A09 /* View+Label.swift */; }; + 94790B512E1179A600BF0A09 /* View+Style.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B3A2E1179A600BF0A09 /* View+Style.swift */; }; + 94790B522E1179A600BF0A09 /* OverflowGrid.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B3E2E1179A600BF0A09 /* OverflowGrid.swift */; }; + 94790B532E1179A600BF0A09 /* PLJob.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B402E1179A600BF0A09 /* PLJob.swift */; }; + 94790B542E1179A600BF0A09 /* IOS_studyApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B452E1179A600BF0A09 /* IOS_studyApp.swift */; }; + 94790B552E1179A600BF0A09 /* PLJobCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B462E1179A600BF0A09 /* PLJobCellView.swift */; }; + 94790B562E1179A600BF0A09 /* PLJobsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B472E1179A600BF0A09 /* PLJobsView.swift */; }; + 94790B572E1179A600BF0A09 /* PLJobView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B482E1179A600BF0A09 /* PLJobView.swift */; }; + 94790B582E1179A600BF0A09 /* PostPLJobIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B492E1179A600BF0A09 /* PostPLJobIView.swift */; }; + 94790B592E1179A600BF0A09 /* TaBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B4A2E1179A600BF0A09 /* TaBarView.swift */; }; + 94790B5B2E1179A600BF0A09 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 94790B422E1179A600BF0A09 /* Preview Assets.xcassets */; }; + 94790B5C2E1179A600BF0A09 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 94790B442E1179A600BF0A09 /* Assets.xcassets */; }; + 94790B5E2E117AD800BF0A09 /* PLJobViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B5D2E117AD800BF0A09 /* PLJobViewModel.swift */; }; + 94790B602E11846F00BF0A09 /* Foundation+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B5F2E11846F00BF0A09 /* Foundation+.swift */; }; + 94790B622E118B3600BF0A09 /* PostPLJobIView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B612E118B3600BF0A09 /* PostPLJobIView+.swift */; }; + 94790B642E118CB400BF0A09 /* HUDView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B632E118CB400BF0A09 /* HUDView.swift */; }; + 94790B662E129CC500BF0A09 /* GType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B652E129CC500BF0A09 /* GType.swift */; }; + 94790B682E137DB300BF0A09 /* PostJobView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B672E137DB300BF0A09 /* PostJobView.swift */; }; + 94790B6A2E13820500BF0A09 /* TaBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B692E13820500BF0A09 /* TaBarViewModel.swift */; }; + 94790B6C2E13879400BF0A09 /* PLJobView+.swift in Sources */ = {isa = PBXBuildFile; fileRef = 94790B6B2E13879300BF0A09 /* PLJobView+.swift */; }; + 947A93D22DEF0EEC002E0937 /* Highlightr in Frameworks */ = {isa = PBXBuildFile; productRef = 947A93D12DEF0EEC002E0937 /* Highlightr */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 94790B342E1179A600BF0A09 /* CJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CJob.swift; sourceTree = ""; }; + 94790B352E1179A600BF0A09 /* CUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CUser.swift; sourceTree = ""; }; + 94790B362E1179A600BF0A09 /* GView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GView.swift; sourceTree = ""; }; + 94790B382E1179A600BF0A09 /* View+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+.swift"; sourceTree = ""; }; + 94790B392E1179A600BF0A09 /* View+Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Label.swift"; sourceTree = ""; }; + 94790B3A2E1179A600BF0A09 /* View+Style.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Style.swift"; sourceTree = ""; }; + 94790B3E2E1179A600BF0A09 /* OverflowGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverflowGrid.swift; sourceTree = ""; }; + 94790B402E1179A600BF0A09 /* PLJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJob.swift; sourceTree = ""; }; + 94790B422E1179A600BF0A09 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 94790B442E1179A600BF0A09 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 94790B452E1179A600BF0A09 /* IOS_studyApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOS_studyApp.swift; sourceTree = ""; }; + 94790B462E1179A600BF0A09 /* PLJobCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobCellView.swift; sourceTree = ""; }; + 94790B472E1179A600BF0A09 /* PLJobsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobsView.swift; sourceTree = ""; }; + 94790B482E1179A600BF0A09 /* PLJobView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobView.swift; sourceTree = ""; }; + 94790B492E1179A600BF0A09 /* PostPLJobIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostPLJobIView.swift; sourceTree = ""; }; + 94790B4A2E1179A600BF0A09 /* TaBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaBarView.swift; sourceTree = ""; }; + 94790B5D2E117AD800BF0A09 /* PLJobViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobViewModel.swift; sourceTree = ""; }; + 94790B5F2E11846F00BF0A09 /* Foundation+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Foundation+.swift"; sourceTree = ""; }; + 94790B612E118B3600BF0A09 /* PostPLJobIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostPLJobIView+.swift"; sourceTree = ""; }; + 94790B632E118CB400BF0A09 /* HUDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HUDView.swift; sourceTree = ""; }; + 94790B652E129CC500BF0A09 /* GType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GType.swift; sourceTree = ""; }; + 94790B672E137DB300BF0A09 /* PostJobView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostJobView.swift; sourceTree = ""; }; + 94790B692E13820500BF0A09 /* TaBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaBarViewModel.swift; sourceTree = ""; }; + 94790B6B2E13879300BF0A09 /* PLJobView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PLJobView+.swift"; sourceTree = ""; }; + 947A93B32DEEE882002E0937 /* IOS_study.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IOS_study.app; sourceTree = BUILT_PRODUCTS_DIR; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 947A93B02DEEE882002E0937 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 947A93D22DEF0EEC002E0937 /* Highlightr in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 94790B372E1179A600BF0A09 /* Constant */ = { + isa = PBXGroup; + children = ( + 94790B342E1179A600BF0A09 /* CJob.swift */, + 94790B352E1179A600BF0A09 /* CUser.swift */, + 94790B362E1179A600BF0A09 /* GView.swift */, + 94790B652E129CC500BF0A09 /* GType.swift */, + ); + path = Constant; + sourceTree = ""; + }; + 94790B3B2E1179A600BF0A09 /* Extension */ = { + isa = PBXGroup; + children = ( + 94790B5F2E11846F00BF0A09 /* Foundation+.swift */, + 94790B382E1179A600BF0A09 /* View+.swift */, + 94790B392E1179A600BF0A09 /* View+Label.swift */, + 94790B3A2E1179A600BF0A09 /* View+Style.swift */, + ); + path = Extension; + sourceTree = ""; + }; + 94790B3F2E1179A600BF0A09 /* Library */ = { + isa = PBXGroup; + children = ( + 94790B632E118CB400BF0A09 /* HUDView.swift */, + 94790B3E2E1179A600BF0A09 /* OverflowGrid.swift */, + ); + path = Library; + sourceTree = ""; + }; + 94790B412E1179A600BF0A09 /* Model */ = { + isa = PBXGroup; + children = ( + 94790B402E1179A600BF0A09 /* PLJob.swift */, + ); + path = Model; + sourceTree = ""; + }; + 94790B432E1179A600BF0A09 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 94790B422E1179A600BF0A09 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; + sourceTree = ""; + }; + 94790B4B2E1179A600BF0A09 /* IOS_study */ = { + isa = PBXGroup; + children = ( + 94790B412E1179A600BF0A09 /* Model */, + 94790B452E1179A600BF0A09 /* IOS_studyApp.swift */, + 94790B4A2E1179A600BF0A09 /* TaBarView.swift */, + 94790B692E13820500BF0A09 /* TaBarViewModel.swift */, + 94790B462E1179A600BF0A09 /* PLJobCellView.swift */, + 94790B472E1179A600BF0A09 /* PLJobsView.swift */, + 94790B482E1179A600BF0A09 /* PLJobView.swift */, + 94790B6B2E13879300BF0A09 /* PLJobView+.swift */, + 94790B5D2E117AD800BF0A09 /* PLJobViewModel.swift */, + 94790B612E118B3600BF0A09 /* PostPLJobIView+.swift */, + 94790B492E1179A600BF0A09 /* PostPLJobIView.swift */, + 94790B672E137DB300BF0A09 /* PostJobView.swift */, + 94790B3B2E1179A600BF0A09 /* Extension */, + 94790B372E1179A600BF0A09 /* Constant */, + 94790B442E1179A600BF0A09 /* Assets.xcassets */, + 94790B3F2E1179A600BF0A09 /* Library */, + 94790B432E1179A600BF0A09 /* Preview Content */, + ); + path = IOS_study; + sourceTree = ""; + }; + 947A93AA2DEEE882002E0937 = { + isa = PBXGroup; + children = ( + 94790B4B2E1179A600BF0A09 /* IOS_study */, + 947A93B42DEEE882002E0937 /* Products */, + ); + sourceTree = ""; + }; + 947A93B42DEEE882002E0937 /* Products */ = { + isa = PBXGroup; + children = ( + 947A93B32DEEE882002E0937 /* IOS_study.app */, + ); + name = Products; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 947A93B22DEEE882002E0937 /* IOS_study */ = { + isa = PBXNativeTarget; + buildConfigurationList = 947A93C12DEEE885002E0937 /* Build configuration list for PBXNativeTarget "IOS_study" */; + buildPhases = ( + 947A93AF2DEEE882002E0937 /* Sources */, + 947A93B02DEEE882002E0937 /* Frameworks */, + 947A93B12DEEE882002E0937 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IOS_study; + packageProductDependencies = ( + 947A93D12DEF0EEC002E0937 /* Highlightr */, + ); + productName = IOS_study; + productReference = 947A93B32DEEE882002E0937 /* IOS_study.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 947A93AB2DEEE882002E0937 /* Project object */ = { + isa = PBXProject; + attributes = { + BuildIndependentTargetsInParallel = 1; + LastSwiftUpdateCheck = 1620; + LastUpgradeCheck = 1620; + TargetAttributes = { + 947A93B22DEEE882002E0937 = { + CreatedOnToolsVersion = 16.2; + }; + }; + }; + buildConfigurationList = 947A93AE2DEEE882002E0937 /* Build configuration list for PBXProject "IOS_study" */; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 947A93AA2DEEE882002E0937; + minimizedProjectReferenceProxies = 1; + packageReferences = ( + 947A93D02DEF0EEC002E0937 /* XCRemoteSwiftPackageReference "Highlightr" */, + ); + preferredProjectObjectVersion = 77; + productRefGroup = 947A93B42DEEE882002E0937 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 947A93B22DEEE882002E0937 /* IOS_study */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 947A93B12DEEE882002E0937 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 94790B5B2E1179A600BF0A09 /* Preview Assets.xcassets in Resources */, + 94790B5C2E1179A600BF0A09 /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 947A93AF2DEEE882002E0937 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 94790B642E118CB400BF0A09 /* HUDView.swift in Sources */, + 94790B4C2E1179A600BF0A09 /* CJob.swift in Sources */, + 94790B662E129CC500BF0A09 /* GType.swift in Sources */, + 94790B4D2E1179A600BF0A09 /* CUser.swift in Sources */, + 94790B682E137DB300BF0A09 /* PostJobView.swift in Sources */, + 94790B4E2E1179A600BF0A09 /* GView.swift in Sources */, + 94790B4F2E1179A600BF0A09 /* View+.swift in Sources */, + 94790B502E1179A600BF0A09 /* View+Label.swift in Sources */, + 94790B512E1179A600BF0A09 /* View+Style.swift in Sources */, + 94790B522E1179A600BF0A09 /* OverflowGrid.swift in Sources */, + 94790B532E1179A600BF0A09 /* PLJob.swift in Sources */, + 94790B542E1179A600BF0A09 /* IOS_studyApp.swift in Sources */, + 94790B552E1179A600BF0A09 /* PLJobCellView.swift in Sources */, + 94790B6A2E13820500BF0A09 /* TaBarViewModel.swift in Sources */, + 94790B6C2E13879400BF0A09 /* PLJobView+.swift in Sources */, + 94790B562E1179A600BF0A09 /* PLJobsView.swift in Sources */, + 94790B622E118B3600BF0A09 /* PostPLJobIView+.swift in Sources */, + 94790B572E1179A600BF0A09 /* PLJobView.swift in Sources */, + 94790B582E1179A600BF0A09 /* PostPLJobIView.swift in Sources */, + 94790B592E1179A600BF0A09 /* TaBarView.swift in Sources */, + 94790B602E11846F00BF0A09 /* Foundation+.swift in Sources */, + 94790B5E2E117AD800BF0A09 /* PLJobViewModel.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 947A93BF2DEEE885002E0937 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 947A93C02DEEE885002E0937 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + 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; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + 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 = 18.2; + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 947A93C22DEEE885002E0937 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"IOS_study/Preview Content\""; + DEVELOPMENT_TEAM = 6M7MAFWB7K; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "cn.tdcat.IOS-study"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 947A93C32DEEE885002E0937 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + DEVELOPMENT_ASSET_PATHS = "\"IOS_study/Preview Content\""; + DEVELOPMENT_TEAM = 6M7MAFWB7K; + ENABLE_PREVIEWS = YES; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; + INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; + INFOPLIST_KEY_UILaunchScreen_Generation = YES; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; + IPHONEOS_DEPLOYMENT_TARGET = 18.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = "cn.tdcat.IOS-study"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 6.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 947A93AE2DEEE882002E0937 /* Build configuration list for PBXProject "IOS_study" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 947A93BF2DEEE885002E0937 /* Debug */, + 947A93C02DEEE885002E0937 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 947A93C12DEEE885002E0937 /* Build configuration list for PBXNativeTarget "IOS_study" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 947A93C22DEEE885002E0937 /* Debug */, + 947A93C32DEEE885002E0937 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 947A93D02DEF0EEC002E0937 /* XCRemoteSwiftPackageReference "Highlightr" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/raspu/Highlightr"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 2.2.1; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 947A93D12DEF0EEC002E0937 /* Highlightr */ = { + isa = XCSwiftPackageProductDependency; + package = 947A93D02DEF0EEC002E0937 /* XCRemoteSwiftPackageReference "Highlightr" */; + productName = Highlightr; + }; +/* End XCSwiftPackageProductDependency section */ + }; + rootObject = 947A93AB2DEEE882002E0937 /* Project object */; +} diff --git a/IOS_study.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/IOS_study.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/IOS_study.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/IOS_study.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/IOS_study.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7c0f2c2 --- /dev/null +++ b/IOS_study.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "0a8fce6d3cd251ad12ea6d2f48f55bfdc4fa43f93e39dce01f4b2baa78e6feb8", + "pins" : [ + { + "identity" : "highlightr", + "kind" : "remoteSourceControl", + "location" : "https://github.com/raspu/Highlightr", + "state" : { + "revision" : "bcf2d0590f32ac2528feb72d7e34f5b463801a47", + "version" : "2.2.1" + } + } + ], + "version" : 3 +} diff --git a/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/Bookmarks/bookmarks.plist b/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/Bookmarks/bookmarks.plist new file mode 100644 index 0000000..c8d4f0a --- /dev/null +++ b/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/Bookmarks/bookmarks.plist @@ -0,0 +1,8 @@ + + + + + top-level-items + + + diff --git a/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/IDEFindNavigatorScopes.plist b/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/IDEFindNavigatorScopes.plist new file mode 100644 index 0000000..5dd5da8 --- /dev/null +++ b/IOS_study.xcodeproj/project.xcworkspace/xcuserdata/tian.xcuserdatad/IDEFindNavigatorScopes.plist @@ -0,0 +1,5 @@ + + + + + diff --git a/IOS_study.xcodeproj/xcshareddata/xcschemes/IOS_study.xcscheme b/IOS_study.xcodeproj/xcshareddata/xcschemes/IOS_study.xcscheme new file mode 100644 index 0000000..fa7e53e --- /dev/null +++ b/IOS_study.xcodeproj/xcshareddata/xcschemes/IOS_study.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IOS_study.xcodeproj/xcuserdata/tian.xcuserdatad/xcschemes/xcschememanagement.plist b/IOS_study.xcodeproj/xcuserdata/tian.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..d470f96 --- /dev/null +++ b/IOS_study.xcodeproj/xcuserdata/tian.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + IOS_study.xcscheme_^#shared#^_ + + orderHint + 0 + + + SuppressBuildableAutocreation + + 947A93B22DEEE882002E0937 + + primary + + + + + diff --git a/IOS_study/Assets.xcassets/AccentColor.colorset/Contents.json b/IOS_study/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..d352008 --- /dev/null +++ b/IOS_study/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,18 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "universal", + "reference" : "systemIndigoColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "localizable" : true + } +} diff --git a/IOS_study/Assets.xcassets/AppIcon.appiconset/Contents.json b/IOS_study/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..2305880 --- /dev/null +++ b/IOS_study/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,35 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "tinted" + } + ], + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/Contents.json b/IOS_study/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/IOS_study/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aBG.colorset/Contents.json b/IOS_study/Assets.xcassets/aBG.colorset/Contents.json new file mode 100644 index 0000000..412aa5e --- /dev/null +++ b/IOS_study/Assets.xcassets/aBG.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "0.996" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.122", + "green" : "0.114", + "red" : "0.114" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aBG2.colorset/Contents.json b/IOS_study/Assets.xcassets/aBG2.colorset/Contents.json new file mode 100644 index 0000000..78a50e2 --- /dev/null +++ b/IOS_study/Assets.xcassets/aBG2.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.965", + "green" : "0.961", + "red" : "0.961" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.078", + "green" : "0.075", + "red" : "0.075" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aBGR.colorset/Contents.json b/IOS_study/Assets.xcassets/aBGR.colorset/Contents.json new file mode 100644 index 0000000..6eb0ef3 --- /dev/null +++ b/IOS_study/Assets.xcassets/aBGR.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.122", + "green" : "0.114", + "red" : "0.114" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "0.996" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aTC 2.colorset/Contents.json b/IOS_study/Assets.xcassets/aTC 2.colorset/Contents.json new file mode 100644 index 0000000..29ead70 --- /dev/null +++ b/IOS_study/Assets.xcassets/aTC 2.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.200", + "green" : "0.200", + "red" : "0.200" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.753", + "green" : "0.753", + "red" : "0.753" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aTC.colorset/Contents.json b/IOS_study/Assets.xcassets/aTC.colorset/Contents.json new file mode 100644 index 0000000..daaed74 --- /dev/null +++ b/IOS_study/Assets.xcassets/aTC.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.200", + "green" : "0.200", + "red" : "0.200" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.878", + "green" : "0.878", + "red" : "0.878" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/aTCR.colorset/Contents.json b/IOS_study/Assets.xcassets/aTCR.colorset/Contents.json new file mode 100644 index 0000000..54acf5f --- /dev/null +++ b/IOS_study/Assets.xcassets/aTCR.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.878", + "green" : "0.878", + "red" : "0.878" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "0.200", + "green" : "0.200", + "red" : "0.200" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/Contents.json b/IOS_study/Assets.xcassets/jobIcons/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/Contents.json new file mode 100644 index 0000000..b5106d0 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "benefit.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/benefit.png b/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/benefit.png new file mode 100644 index 0000000..f36afaf Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/benefit.imageset/benefit.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/company.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/company.imageset/Contents.json new file mode 100644 index 0000000..3f022af --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/company.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "company.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/company.imageset/company.png b/IOS_study/Assets.xcassets/jobIcons/company.imageset/company.png new file mode 100644 index 0000000..b13eb9a Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/company.imageset/company.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/content.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/content.imageset/Contents.json new file mode 100644 index 0000000..8b7476d --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/content.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "content.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/content.imageset/content.png b/IOS_study/Assets.xcassets/jobIcons/content.imageset/content.png new file mode 100644 index 0000000..5b34d3d Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/content.imageset/content.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/employ.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/employ.imageset/Contents.json new file mode 100644 index 0000000..c0d31cf --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/employ.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "employ.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/employ.imageset/employ.png b/IOS_study/Assets.xcassets/jobIcons/employ.imageset/employ.png new file mode 100644 index 0000000..1c70ffe Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/employ.imageset/employ.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/leader.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/leader.imageset/Contents.json new file mode 100644 index 0000000..0991505 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/leader.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "leader.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/leader.imageset/leader.png b/IOS_study/Assets.xcassets/jobIcons/leader.imageset/leader.png new file mode 100644 index 0000000..7da6987 Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/leader.imageset/leader.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/need.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/need.imageset/Contents.json new file mode 100644 index 0000000..24ff476 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/need.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "need.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/need.imageset/need.png b/IOS_study/Assets.xcassets/jobIcons/need.imageset/need.png new file mode 100644 index 0000000..f7ff6b8 Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/need.imageset/need.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/station.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/station.imageset/Contents.json new file mode 100644 index 0000000..ec47dc7 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/station.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "station.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/station.imageset/station.png b/IOS_study/Assets.xcassets/jobIcons/station.imageset/station.png new file mode 100644 index 0000000..c3cf318 Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/station.imageset/station.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/time.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/time.imageset/Contents.json new file mode 100644 index 0000000..3babb4d --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/time.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "time.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/time.imageset/time.png b/IOS_study/Assets.xcassets/jobIcons/time.imageset/time.png new file mode 100644 index 0000000..c031798 Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/time.imageset/time.png differ diff --git a/IOS_study/Assets.xcassets/jobIcons/want.imageset/Contents.json b/IOS_study/Assets.xcassets/jobIcons/want.imageset/Contents.json new file mode 100644 index 0000000..4216159 --- /dev/null +++ b/IOS_study/Assets.xcassets/jobIcons/want.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "filename" : "want.png", + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/jobIcons/want.imageset/want.png b/IOS_study/Assets.xcassets/jobIcons/want.imageset/want.png new file mode 100644 index 0000000..8d15708 Binary files /dev/null and b/IOS_study/Assets.xcassets/jobIcons/want.imageset/want.png differ diff --git a/IOS_study/Assets.xcassets/view.imageset/Contents.json b/IOS_study/Assets.xcassets/view.imageset/Contents.json new file mode 100644 index 0000000..780206c --- /dev/null +++ b/IOS_study/Assets.xcassets/view.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "filename" : "冰岛极光风景4k壁纸3840x2160_彼岸图网.jpg", + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/Assets.xcassets/view.imageset/冰岛极光风景4k壁纸3840x2160_彼岸图网.jpg b/IOS_study/Assets.xcassets/view.imageset/冰岛极光风景4k壁纸3840x2160_彼岸图网.jpg new file mode 100644 index 0000000..4cce52b Binary files /dev/null and b/IOS_study/Assets.xcassets/view.imageset/冰岛极光风景4k壁纸3840x2160_彼岸图网.jpg differ diff --git a/IOS_study/Constant/CJob.swift b/IOS_study/Constant/CJob.swift new file mode 100644 index 0000000..d7ee9dc --- /dev/null +++ b/IOS_study/Constant/CJob.swift @@ -0,0 +1,21 @@ +// +// CJob.swift +// IOS_study +// +// Created by CC-star on 2025/6/28. +// + +import Foundation + +let kTFAndPHeight: CGFloat = 36 + + +let kBusinessArr = ["互联网","便利店","饭馆"] +let kTaxArr = ["详谈","报税","不报税"] +let kWantNumArr = [1,2,3,4,5,6,7,8,9,10,13,15,16,63,75,856,345] +let kNeedExpArr = ["经验不限","1年以内","1-3年","3-5年","5-10年"] +let kNeedEduArr = ["中专","高中","大专","本科","硕士研究生","博士研究生","博士后"] +let kNeedLanArr = ["Swift","Objective-c","Java","C","Vue","Golong","Kotlin"] +let kNeedFrameArr = ["SwiftUI","UIKit","Spring","Jetpack Compose"] +let kProvinceArr = ["重庆","浙江","四川","北京"] +let kContactTypeArr = ["微信","QQ","电话","邮件","其他"] diff --git a/IOS_study/Constant/CUser.swift b/IOS_study/Constant/CUser.swift new file mode 100644 index 0000000..c46f384 --- /dev/null +++ b/IOS_study/Constant/CUser.swift @@ -0,0 +1,13 @@ +// +// CUser.swift +// IOS_study +// +// Created by CC-star on 2025/6/14. +// + +import Foundation + +let kIconSpacing: CGFloat = 3 +let kStackSpacing: CGFloat = 14 +let kStackSpacingS: CGFloat = 9 + diff --git a/IOS_study/Constant/GType.swift b/IOS_study/Constant/GType.swift new file mode 100644 index 0000000..142c6ac --- /dev/null +++ b/IOS_study/Constant/GType.swift @@ -0,0 +1,12 @@ +// +// GType.swift +// IOS_study +// +// Created by CC-star on 2025/6/30. +// + +import Foundation + +enum Navi1 { + case PLJobsToPLJob,PLJobToEdit +} diff --git a/IOS_study/Constant/GView.swift b/IOS_study/Constant/GView.swift new file mode 100644 index 0000000..86352a1 --- /dev/null +++ b/IOS_study/Constant/GView.swift @@ -0,0 +1,20 @@ +// +// GView.swift +// IOS_study +// +// Created by CC-star on 2025/6/26. +// + +import SwiftUI + +func exDivider() -> some View{ + Rectangle().fill(Color.labeBG).frame(height: 1)//分割线[系统自带的Divider有时候不显示] +} +@MainActor +func listBottomEView() -> some View{ + Color.clear.frame(height: 120).listRowStyle() +} + +func postBottomEView() -> some View{ + Color.clear.frame(height: 120) +} diff --git a/IOS_study/Extension/Foundation+.swift b/IOS_study/Extension/Foundation+.swift new file mode 100644 index 0000000..8acf0ec --- /dev/null +++ b/IOS_study/Extension/Foundation+.swift @@ -0,0 +1,41 @@ +// +// Foundation+.swift +// IOS_study +// +// Created by CC-star on 2025/6/29. +// + +import Foundation + + +extension String { + var isBlank: Bool { + self.isEmpty || self.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty//没有输入或者输入空格 + } + var trimmed: String { + self.trimmingCharacters(in: .whitespacesAndNewlines) + } +} + +extension Date { + var daysFromNow: Int { + Calendar.current.dateComponents([.day], from: self, to: .now).day ?? 0//??空合运算符 + } + + + + // let date = Date() + // print(date.string(withFormat: "yyyy/MM/dd HH:mm")) // 2023/08/24 16:21 + // print(date.string(withFormat: "yyyy/MM/dd hh:mm")) // 2023/08/24 04:21 + var toStr: String { + let year = Calendar.current.component(.year, from: self) + let currentYear = Calendar.current.component(.year, from: Date()) + let dateFormatter = DateFormatter() + dateFormatter.dateFormat = (year == currentYear) ? "M-d" : "yyyy-M-d" + return dateFormatter.string(from: self) + } + + +} + + diff --git a/IOS_study/Extension/View+.swift b/IOS_study/Extension/View+.swift new file mode 100644 index 0000000..34545f0 --- /dev/null +++ b/IOS_study/Extension/View+.swift @@ -0,0 +1,77 @@ +// +// View+.swift +// IOS_study +// +// Created by CC-star on 2025/6/12. +// + +import SwiftUI + +extension View{ + + //矩形圆角 + func radius(_ radius: CGFloat = 4) -> some View{ clipShape(RoundedRectangle(cornerRadius: radius)) } +// func radius2(_ radius: CGFloat = 4) -> some View{ clipShape(RoundedRectangle(cornerRadius: radius)) } + func border(radius: CGFloat = 4, borderColor: Color) -> some View{ + overlay { RoundedRectangle(cornerRadius: radius).strokeBorder(borderColor, lineWidth: 1) } + } + + //颜色 + func tc() -> some View{ foregroundStyle(.aTC) } + func tc2() -> some View{ foregroundStyle(.aTC2) } + func secondary() -> some View{ foregroundStyle(.secondary) } + func accent() -> some View{ foregroundStyle(.accent) } + func white() -> some View{ foregroundStyle(.white) } + func red() -> some View{ foregroundStyle(.red) } + func purple() -> some View{ foregroundStyle(.purple) } + func bg() -> some View{ background(Color.aBG) } + func bg2() -> some View{ background(Color.aBG2) } + + //字体大小 + func size11() -> some View{ font(.system(size: 11)) } + func size12() -> some View{ font(.system(size: 12)) } + func size13() -> some View{ font(.system(size: 13)) } + func size13s() -> some View{ size13().secondary() } + func size14() -> some View{ font(.system(size: 14)) } + func size15() -> some View{ font(.system(size: 15)) } + func size16() -> some View{ font(.system(size: 16)) } + func size16semib() -> some View{ font(.system(size: 16)).semib() } + func size17() -> some View{ font(.system(size: 17)) } + func headline() -> some View{ font(.headline) } + func size18b() -> some View{ font(.system(size: 18)).bold() } + func size18ab() -> some View{ font(.system(size: 18)).bold().accent() } + func size20b() -> some View{ font(.title3).bold() } + + //字体粗细 + func med() -> some View{ fontWeight(.medium) } + func semib() -> some View{ fontWeight(.semibold) } + + func push(to alignment: Alignment) -> some View { + frame(maxWidth: .infinity, alignment: alignment) + } + + + func allowMulti() -> some View{ + fixedSize(horizontal: false, vertical: true).textSelection(.enabled).multilineTextAlignment(.leading) + } + +} + +extension Color{ + static let labeBG = Color(.systemFill) + static let labelBG2 = Color(.systemGray5) + static let bg = Color.aBG +} + + +// MARK: - 让右滑返回上一页有效 +extension UINavigationController: @retroactive UIGestureRecognizerDelegate { + override open func viewDidLoad() { + super.viewDidLoad() + interactivePopGestureRecognizer?.delegate = self + } + + public func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { return viewControllers.count > 1 } + + public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { true } +} diff --git a/IOS_study/Extension/View+Label.swift b/IOS_study/Extension/View+Label.swift new file mode 100644 index 0000000..f445996 --- /dev/null +++ b/IOS_study/Extension/View+Label.swift @@ -0,0 +1,77 @@ +// +// View+Label.swift +// IOS_study +// +// Created by CC-star on 2025/6/12. +// + +import SwiftUI + +extension View { + func padding1() -> some View{ + padding(.vertical,2) + .padding(.horizontal,3) + } + func padding3() -> some View{ + padding(.vertical,4) + .padding(.horizontal,7) + } + func redBorder() -> some View{ + size12() + .red() + .semib() + .padding1() + .border(borderColor: Color.red) + } + func accentBorder() -> some View{ + size12() + .accent() + .semib() + .padding1() + .border(borderColor: Color.accent) + } + + + func labelBG() -> some View{ + size13() + .tc() + .semib() + .padding3() + .background(Color.labeBG)//背景一般先padding,再background + .radius() + } + + func labelBG2() -> some View{ + size13() + .tc() + .med() + .padding3() + .background(Color.labelBG2)//背景一般先padding,再background + .radius() + } + func labelPP() -> some View{ + size13() + .purple() + .med() + .padding3() + .background(Color.purple.opacity(0.18))//背景一般先padding,再background + .radius() + } + + func labelWA() -> some View{ + size11() + .white() + .padding1() + .background(Color.accent) + .radius() + } + + func labelWAL() -> some View{ + size14() + .white() + .med() + .padding3() + .background(Color.accent) + .radius() + } +} diff --git a/IOS_study/Extension/View+Style.swift b/IOS_study/Extension/View+Style.swift new file mode 100644 index 0000000..4244c37 --- /dev/null +++ b/IOS_study/Extension/View+Style.swift @@ -0,0 +1,113 @@ +// +// View+Style.swift +// IOS_study +// +// Created by CC-star on 2025/6/12. +// + +import SwiftUI + +extension View{ + + func btnStyle() -> some View{ + size15().buttonStyle(.borderless).accent() + } + + func textStyle() -> some View{ + size15().tc().lineSpacing(6) + } + + + func textStyle2() -> some View{ + size15().tc2().lineSpacing(6) + } + + func oneLineStyleMiddle() -> some View{lineLimit(1).truncationMode(.middle)} + + //List里面的东西 + func subTStyle() -> some View{ + size16semib().tc() + } + + func subTStyleL() -> some View{ + headline().tc() + } + + + + //cell + func cellPaddingRadius() -> some View{//带radius + padding(.vertical) + .padding(.horizontal,12) + .bg() + .radius(8) + } + func cellOutPadding() -> some View{ + padding([.top,.horizontal],9) + //.padding(.bottom,10) + } + + + //list + func listRowStyle() -> some View{ + listRowInsets(EdgeInsets()) + .listRowSeparator(.hidden) + .listRowBackground(Color.clear) + } + + func listStyle() -> some View{ + listStyle(.inset) + .scrollContentBackground(.hidden) + .bg2() + .environment(\.defaultMinListRowHeight,0) } + + //总的 + func cellStyle() -> some View{ + cellPaddingRadius().cellOutPadding().listRowStyle() + } + + //Form里面的 + func littleTStyle() -> some View{ + size13().tc2().fontWeight(.light) + } + func pStyle() -> some View{ + frame(height: kTFAndPHeight).border(borderColor: Color(.systemGray4)) + } + func tfStyle() -> some View{ + frame(height: kTFAndPHeight).padding(.horizontal,9).border(borderColor: Color(.systemGray4)).submitLabel(.done) + } + func tfStyleMultiS() -> some View{ + lineLimit(1...4).frame(minHeight: kTFAndPHeight).padding(.horizontal,9).border(borderColor: Color(.systemGray4)).lineSpacing(4) + .fixedSize(horizontal: false, vertical: true) + } + func tfStyleMultiM() -> some View{ + lineLimit(3...8).frame(minHeight: kTFAndPHeight).padding(.horizontal,9).border(borderColor: Color(.systemGray4)).lineSpacing(4) + .fixedSize(horizontal: false, vertical: true) + } + func tfStyleMultiL() -> some View{ + lineLimit(4...10).frame(minHeight: kTFAndPHeight).padding(.horizontal,9).border(borderColor: Color(.systemGray4)).lineSpacing(4) + .fixedSize(horizontal: false, vertical: true) + } + func conlonStyle() -> some View{ + bold().padding(.horizontal,2).offset(y: -1) + } + func toggleStyle(isTap: Bool) -> some View{ + size15().foregroundStyle(isTap ? .white : .aTC).padding(.horizontal,10).frame(height: kTFAndPHeight) + .background(isTap ? Color.accent.gradient : Color.bg.gradient).radius() + .border(borderColor: isTap ? .clear : .accent) + } + + func appleStyle() -> some View{ + headline().white().frame(height: 55).frame(maxWidth: .infinity).background(.accent.gradient).radius() + } + + +} + + +extension Image{ + func iconStyle() -> some View { + resizable().frame(width: 16, height: 16) + } +} + diff --git a/IOS_study/IOS_studyApp.swift b/IOS_study/IOS_studyApp.swift new file mode 100644 index 0000000..30aaa06 --- /dev/null +++ b/IOS_study/IOS_studyApp.swift @@ -0,0 +1,39 @@ +// +// IOS_studyApp.swift +// IOS_study +// +// Created by CC-star on 2025/6/3. +// + +import SwiftUI + +@main +struct IOS_studyApp: App { + // init(){ + // + // } + @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate + @State var hud = HUD() + @State var tabbarVM = TabBarViewModel() + @State var plJobVM = PLJobViewModel() + var body: some Scene { + WindowGroup { + TaBarView() + .hud(isPresented: $hud.isPresented){ + Text(hud.title) + } + .environment(hud) + .environment(tabbarVM) + .environment(plJobVM) + } + } +} + +@MainActor class AppDelegate: NSObject, UIApplicationDelegate { + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { + UISegmentedControl.appearance().selectedSegmentTintColor = .accent + UISegmentedControl.appearance().setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 17,weight: .medium),.foregroundColor: UIColor(Color.aTC)], for: .normal) + UISegmentedControl.appearance().setTitleTextAttributes([.font: UIFont.systemFont(ofSize: 17,weight: .semibold),.foregroundColor: UIColor(Color.white)], for: .selected) + return true + } +} diff --git a/IOS_study/Img/chongwutubiao04.png b/IOS_study/Img/chongwutubiao04.png new file mode 100644 index 0000000..1760c70 Binary files /dev/null and b/IOS_study/Img/chongwutubiao04.png differ diff --git a/IOS_study/Library/HUDView.swift b/IOS_study/Library/HUDView.swift new file mode 100644 index 0000000..27792ed --- /dev/null +++ b/IOS_study/Library/HUDView.swift @@ -0,0 +1,38 @@ +import SwiftUI +import Combine +// 悬浮提示框 +extension View { + func hud (isPresented: Binding, @ViewBuilder content: () -> Content) -> some View { + ZStack { + self + if isPresented.wrappedValue { + HUDView(content: content).zIndex(1) + } + }.animation(.default, value: isPresented.wrappedValue) + } +} +struct HUDView: View { + @ViewBuilder let content: Content + var body: some View { + content.font(.subheadline).foregroundStyle(Color.aTCR) + .padding(.horizontal, 4).padding(12) + .background(RoundedRectangle(cornerRadius: 8).fill(Color.aBGR)) + } +} +@Observable final class HUD { + var isPresented = false + private(set) var title: String = "" + private var dismissTimer: AnyCancellable? // 用于管理计时器-追加代码-因原版本多次按下后消失不了 + func show(_ title: String) { + self.title = title + isPresented = true + dismissTimer?.cancel()// 取消之前的计时器,确保每次调用时重置-追加代码 + // 3秒后自动隐藏-追加代码 + dismissTimer = Timer.publish(every: 3, on: .main, in: .common) + .autoconnect() + .sink { [weak self] _ in + self?.isPresented = false + self?.dismissTimer?.cancel() // 确保计时器在执行后被取消 + } + } +} diff --git a/IOS_study/Library/OverflowGrid.swift b/IOS_study/Library/OverflowGrid.swift new file mode 100644 index 0000000..43dcbb1 --- /dev/null +++ b/IOS_study/Library/OverflowGrid.swift @@ -0,0 +1,50 @@ +import SwiftUI + +//自动换行 +//https://stackoverflow.com/questions/58842453/hstack-with-wrap RelativeJoe的回答 +public struct OverflowGrid: Layout { + private var horizontalSpacing: CGFloat + private var vericalSpacing: CGFloat + public init(horizontalSpacing: CGFloat, vericalSpacing: CGFloat? = nil) { + self.horizontalSpacing = horizontalSpacing + self.vericalSpacing = vericalSpacing ?? horizontalSpacing + } + public func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) -> CGSize { + let height = subviews.max(by: {$0.dimensions(in: proposal).height > $1.dimensions(in: proposal).height})?.dimensions(in: proposal).height ?? 0 + var rows = [CGFloat]() + subviews.indices.forEach { index in + let rowIndex = rows.count - 1 + let subViewWidth = subviews[index].dimensions(in: proposal).width + guard !rows.isEmpty else { + rows.append(subViewWidth) + return + } + let newWidth = rows[rowIndex] + subViewWidth + horizontalSpacing + if newWidth < proposal.width ?? 0 { + rows[rowIndex] += (rows[rowIndex] > 0 ? horizontalSpacing: 0) + subViewWidth + }else { + rows.append(subViewWidth) + } + } + let count = CGFloat(rows.count) + return CGSize(width: rows.max() ?? 0, height: count * height + (count - 1) * vericalSpacing) + + } + public func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout ()) { + let height = subviews.max(by: {$0.dimensions(in: proposal).height > $1.dimensions(in: proposal).height})?.dimensions(in: proposal).height ?? 0 + guard !subviews.isEmpty else {return} + var x = bounds.minX + var y = height/2 + bounds.minY + subviews.indices.forEach { index in + let subView = subviews[index] + x += subView.dimensions(in: proposal).width/2 + subviews[index].place(at: CGPoint(x: x, y: y), anchor: .center, proposal: ProposedViewSize(width: subView.dimensions(in: proposal).width, height: subView.dimensions(in: proposal).height)) + x += horizontalSpacing + subView.dimensions(in: proposal).width/2 + if x > bounds.width { + x = bounds.minX + y += height + vericalSpacing + } + } + } +} + diff --git a/IOS_study/Model/PLJob.swift b/IOS_study/Model/PLJob.swift new file mode 100644 index 0000000..eca0c36 --- /dev/null +++ b/IOS_study/Model/PLJob.swift @@ -0,0 +1,63 @@ +// +// PLJob.swift +// IOS_study +// +// Created by CC-star on 2025/6/28. +// + +import Foundation + +struct PLJob: Identifiable {//遵循莫个协议 + var id = UUID().uuidString + var isActive = true + var title = "" + var business = "互联网" + var tax = "详谈" + var hourlyWage = 100//时给 + var wantNum = 3 + var contactType = "微信" + var contact = "" + + //工作时间地点内容 + var startHour = 10 + var startMin = 0 + var endHour = 20 + var endMin = 0 + + //点击状态 + var has2 = false + //第二个时间 + var startHour2 = 10 + var startMin2 = 0 + var endHour2 = 20 + var endMin2 = 0 + + var otherTime = "" + + var placeName = "" + var province = "北京" + var city = "" + var workContent = "" + + //工作要求 + var needExp = "1-3年" + var needEdu = "本科" + var needLan = "Swift" + var needFrame = "SwiftUI" + var otherNeed = "" + + //福利 + var moveFee = true + var noOverTime = true//不加班 + var otherBenefit = "" + + + //其他 + var companyName = "" + var usrID = "" + //var creatTime = "" + var updatedAt = Date() + + + static let job = PLJob(title: "iOS程序员", tax: "报税", contact: "12345", has2: true, startHour2: 14, endHour2: 22, otherTime: "可以根据实际情况调整", placeName: "阿里巴巴西溪园区", province: "浙江", city: "杭州", workContent: "iOS开发啊啊iOS开发啊啊iOS开发啊啊iOS开发啊啊iOS开发啊啊iOS开发啊啊", otherNeed: "什么都不需要啊啊什么都不需要啊啊什么都不需要啊啊什么都不需要啊啊", otherBenefit: "什么都有啊啊什么都有啊啊什么都有啊啊什么都有啊啊什么都有啊啊",companyName:"阿里巴巴") +} diff --git a/IOS_study/PLJobCellView.swift b/IOS_study/PLJobCellView.swift new file mode 100644 index 0000000..355a601 --- /dev/null +++ b/IOS_study/PLJobCellView.swift @@ -0,0 +1,65 @@ +// +// PLJobCellView.swift +// IOS_study +// +// Created by CC-star on 2025/6/12. +// + +import SwiftUI + +struct PLJobCellView: View { + let job: PLJob + var body: some View { + VStack(spacing: 8) { + //第一层 + HStack { + VStack(alignment: .leading) { + HStack { + Text(job.business) + .labelBG2() + if job.updatedAt.daysFromNow <= 7 { Text("新到").labelWA() } + Text("3人想去") + .size13s() + } + HStack { + Text(job.title).tc().headline().oneLineStyleMiddle() + + if job.tax == "不报税" { + Text(job.tax).accentBorder() + } else if job.tax == "报税" { + Text(job.tax).redBorder() + } + } + } + Spacer() + Text("\(job.hourlyWage)").accent().headline() + } + //第二层 + OverflowGrid(horizontalSpacing: 5) { + Text(job.needExp).labelBG() + Text(job.needEdu).labelBG() + Text(job.needLan).labelBG() + Text(job.needFrame).labelBG() + Text("\(job.startHour)-\(job.endHour)").labelBG() + if job.has2 { + Text("\(job.startHour2)-\(job.endHour2)").labelBG() + } + if job.moveFee { Text("交通费").labelPP() } + if job.noOverTime { Text("不加班").labelPP() } + + }.push(to: .leading) + + //第三层 + HStack { + Text(job.placeName).tc().lineLimit(1) + Spacer() + Text("\(job.province)-\(job.city)").accent().semib().oneLineStyleMiddle() + }.size14() + } + .cellPaddingRadius().cellOutPadding() + } +} + +#Preview { + PLJobCellView(job: PLJob.job) +} diff --git a/IOS_study/PLJobView+.swift b/IOS_study/PLJobView+.swift new file mode 100644 index 0000000..8b7b9f7 --- /dev/null +++ b/IOS_study/PLJobView+.swift @@ -0,0 +1,23 @@ +// +// PLJobView+.swift +// IOS_study +// +// Created by CC-star on 2025/7/1. +// + +import SwiftUI + +extension PLJobView { + func toggleJobStatus() { + vm.toggleJobStatus() + hud.show(isActive ? "上线成功" : "下线成功")//这里是相反的逻辑,应为之前已经反转过一次了 + } + + func removeJob() { + vm.removeJob() + hud.show("删除成功") + if !naviPath.isEmpty { + naviPath.removeLast() + } + } +} diff --git a/IOS_study/PLJobView.swift b/IOS_study/PLJobView.swift new file mode 100644 index 0000000..14c8054 --- /dev/null +++ b/IOS_study/PLJobView.swift @@ -0,0 +1,253 @@ +// +// PLJobView.swift +// IOS_study +// +// Created by CC-star on 2025/6/13. +// + +import SwiftUI +struct PLJobView: View { + @Environment(PLJobViewModel.self) var vm + @State var showActiveDialog = false + @State var showRemoveDialog = false + @State var showRemoveAlert = false + @Binding var naviPath : NavigationPath + var job: PLJob { vm.job } + var isActive:Bool{ vm.job.isActive } + var titleAD: String { isActive ? "" : "[已下线]" } + @Environment(HUD.self) var hud + var body: some View { + List { + //头部视图 + VStack(alignment: .leading,spacing: kStackSpacing) { + //第一层 + HStack { + VStack(alignment: .leading) { + HStack { + Text(job.business) + .labelBG2() + if job.updatedAt.daysFromNow <= 7 { Text("新到").labelWA() } + Text("3人想去") + .size13s() + } + Text(job.title + titleAD).tc().size18b() + } + Spacer() + Text("\(job.hourlyWage)").accent().headline() + }.padding(.bottom,-2) + //第二层 + HStack{ + Text(job.placeName) + + if job.tax == "不报税" { + Text(job.tax).accentBorder() + } else if job.tax == "报税" { + Text(job.tax).redBorder() + } + + Text("\(job.updatedAt.toStr)发布").secondary() + } + //第三层 + HStack(spacing: kStackSpacing){ + HStack { + HStack(spacing: kIconSpacing) { + //icon + Image("station").iconStyle() + Text("\(job.province)-\(job.city)").semib() + Button { + if let url = URL(string: "https://maps.google.com/?q=\(job.province)\(job.city)"){ + UIApplication.shared.open(url) + } + } label: { + Text("导航") + }.btnStyle() + } + HStack(spacing: kIconSpacing) { + Image("want").iconStyle() + Text("招\(job.wantNum)人") + } + HStack { + Button("编辑") { + vm.draftJob = job + naviPath.append(Navi1.PLJobToEdit) + }.buttonStyle(.borderless).accent() + Button(isActive ? "下线" : "上线") { + showActiveDialog = true + }.buttonStyle(.borderless).accent() + .confirmationDialog(isActive ? "确定下线吗" : "确定上线吗", isPresented: $showActiveDialog, titleVisibility: .visible) { + Button("确定") { + toggleJobStatus() + } + Button("再想想", role: .cancel) { } + } + Button("删除") { + showRemoveDialog = true + }.buttonStyle(.borderless).accent() + .confirmationDialog("确定删除吗", isPresented: $showRemoveDialog, titleVisibility: .visible) { + Button("确定", role: .destructive) { + showRemoveAlert = true + } + Button("再想想", role: .cancel) { } + }.alert("删除之后不可恢复", isPresented: $showRemoveAlert) { + Button("确定", role: .destructive) { removeJob() } + Button("取消", role: .cancel) { } + } + + } + } + } + }.textStyle2().cellStyle() + //公司 + Button { + + } label: { + HStack(spacing: kIconSpacing){ + Image("company").iconStyle() + Text(job.companyName).size16semib().oneLineStyleMiddle() + Spacer() + Group { + Text("更多工作") + Image(systemName: "chevron.right") + }.secondary() + } + }.textStyle().cellStyle().buttonStyle(.borderless) + + //工作详情 + VStack(alignment: .leading,spacing:kStackSpacingS) { + //公司时间 + VStack(alignment: .leading,spacing: kStackSpacingS) { + HStack(spacing: kIconSpacing) { + Image("time").iconStyle() + Text("工作时间").subTStyle() + } + + HStack(spacing: 2) { + Text("\(job.startHour)") + Text(":").conlonStyle() + Text(job.startMin == 0 ? "00" : "\(job.startMin)") + Text("-").conlonStyle() + Text("\(job.endHour)") + Text(":").conlonStyle() + Text(job.endMin == 0 ? "00" : "\(job.endMin)") + } + + if job.has2 { + HStack(spacing: 2) { + Text("\(job.startHour2)") + Text(":").conlonStyle() + Text(job.startMin2 == 0 ? "00" : "\(job.startMin2)") + Text("-").conlonStyle() + Text("\(job.endHour2)") + Text(":").conlonStyle() + Text(job.endMin2 == 0 ? "00" : "\(job.endMin2)") + } + + } + +// Text("\(job.startHour)-\(job.endHour)").labelBG() +// if job.has2 { +// Text("\(job.startHour2)-\(job.endHour2)").labelBG() +// } + } + + // Divider() + exDivider() + if !job.workContent.isEmpty { + //工作内容 + VStack(alignment: .leading,spacing: kStackSpacingS) { + HStack(spacing: kIconSpacing) { + Image("content").iconStyle() + Text("工作内容").subTStyle() + } + Text(job.workContent).allowMulti() + } + exDivider() + } + //工作要求 + VStack(alignment: .leading,spacing: kStackSpacingS) { + HStack(spacing: kIconSpacing) { + Image("need").iconStyle() + Text("工作要求").subTStyle() + } + HStack { + Text(job.needExp).labelWAL() + Text(job.needEdu).labelWAL() + } + HStack { + Text(job.needLan).labelWAL() + Text(job.needFrame).labelWAL() + } + if !job.otherNeed.isEmpty { + Text(job.otherNeed).allowMulti() + } + } + + //公式福利 + exDivider() + VStack(alignment: .leading,spacing: kStackSpacingS) { + HStack(spacing: kIconSpacing) { + Image("benefit").iconStyle() + Text("公式福利").subTStyle() + } + HStack { + if job.noOverTime { + Text("不加班").labelWAL() + } + if job.moveFee { + Text("交通费").labelWAL() + } + } + //更多福利 + if !job.otherBenefit.isEmpty { + Text(job.otherBenefit).allowMulti() + } + } + }.textStyle2().cellStyle() + + + //应聘电话 + VStack(alignment: .leading,spacing:kStackSpacingS){ + Text("应聘方式(\(job.contactType))").subTStyleL() + HStack { + Text("\(job.contact)").size20b().tc().allowMulti() + Spacer() + Button("复制"){ + UIPasteboard.general.string = job.contact + hud.show("复制成功") + //todo弹窗提示 + }.btnStyle().padding(6) + + + // Button { + // UIPasteboard.general.string = "0423-1230-1241" + // //todo弹窗提示 + // } + // } label: { + // Text("复制") + // }.btnStyle().padding(6) + } + Text("若问起,请说是在“测试软件”上看到的").size14().purple() + }.cellStyle() + + listBottomEView() + + }.listStyle().navigationTitle("长期兼职").navigationBarTitleDisplayMode(.inline).navigationBarBackButtonHidden() + //顶部返回键 + .toolbar { + ToolbarItem(placement: .topBarLeading) { + Button { + if !naviPath.isEmpty {//检查是否为最后一页 + naviPath.removeLast()//返回上一页 + } + } label: { + Image(systemName: "chevron.left").secondary().padding(.horizontal,6) + }.btnStyle() + } + } + } +} + +//#Preview { +// PLJobView(naviPath: .constant(NavigationPath())) +//} + diff --git a/IOS_study/PLJobViewModel.swift b/IOS_study/PLJobViewModel.swift new file mode 100644 index 0000000..9ea290e --- /dev/null +++ b/IOS_study/PLJobViewModel.swift @@ -0,0 +1,42 @@ +// +// PLJobViewModel.swift +// IOS_study +// +// Created by CC-star on 2025/6/29. +// + +import Foundation + +@Observable final class PLJobViewModel { + var job = PLJob() + var draftJob = PLJob() + var jobs: [PLJob] = [.job]//todo上架前要删掉 + + func postJob() { + job = draftJob +// job.updatedAt = Date() + + //处理空格(必填部分) + job.title = job.title.trimmed + job.placeName = job.placeName.trimmed + job.province = job.province.trimmed + job.city = job.city.trimmed + //处理空格(选填部分) + if job.otherTime.isBlank { job.otherTime = "" } else { job.otherTime = job.otherTime.trimmed } + if job.otherNeed.isBlank { job.otherNeed = "" } else { job.otherNeed = job.otherNeed.trimmed } + if job.workContent.isBlank { job.workContent = "" } else { job.workContent = job.workContent.trimmed } + if job.otherBenefit.isBlank { job.otherBenefit = "" } else { job.otherBenefit = job.otherBenefit.trimmed } + + + //todo存到数据库 + + } + + func toggleJobStatus() { + job.isActive.toggle() + } + func removeJob() { + job.isActive.toggle() + } + +} diff --git a/IOS_study/PLJobsView.swift b/IOS_study/PLJobsView.swift new file mode 100644 index 0000000..ae315fe --- /dev/null +++ b/IOS_study/PLJobsView.swift @@ -0,0 +1,37 @@ +// +// PLJobsView.swift +// IOS_study +// +// Created by CC-star on 2025/6/12. +// + +import SwiftUI + +struct PLJobsView: View { + @Environment(PLJobViewModel.self) var vm + @State var naviPath = NavigationPath() + var body: some View { + NavigationStack(path: $naviPath) { + List{ + ForEach(vm.jobs) {job in + Button { + vm.job = job + naviPath.append(Navi1.PLJobsToPLJob) + } label: { + PLJobCellView(job: job) + }.buttonStyle(.borderless) + }.listRowStyle() + }.listStyle() + .navigationDestination(for: Navi1.self) { navi in + switch navi { + case .PLJobsToPLJob : PLJobView(naviPath: $naviPath) + case .PLJobToEdit : PostPLJobIView(isEditing: true,naviPath: $naviPath) + } + } + } + } +} + +#Preview { + PLJobsView() +} diff --git a/IOS_study/PostJobView.swift b/IOS_study/PostJobView.swift new file mode 100644 index 0000000..67c5b98 --- /dev/null +++ b/IOS_study/PostJobView.swift @@ -0,0 +1,17 @@ +// +// PostJobView.swift +// IOS_study +// +// Created by CC-star on 2025/6/28. +// + +import SwiftUI + +struct PostJobView: View { + @State var naviPath = NavigationPath() + var body: some View { + NavigationStack(path: $naviPath) { + PostPLJobIView(naviPath: $naviPath) + } + } +} diff --git a/IOS_study/PostPLJobIView+.swift b/IOS_study/PostPLJobIView+.swift new file mode 100644 index 0000000..fc51e63 --- /dev/null +++ b/IOS_study/PostPLJobIView+.swift @@ -0,0 +1,38 @@ +// +// PostPLJobIView+.swift +// IOS_study +// +// Created by CC-star on 2025/6/29. +// + +import SwiftUI + +extension PostPLJobIView { + func postJob() { + if let incalidMsg = incalidMsg {//也可以写成if let incalidMsg + hud.show(incalidMsg) + return + } +// print("输入ok") + workPlaceName = draftJob.placeName + workProvince = draftJob.province + workCity = draftJob.city + workContact = draftJob.contact + + vm.draftJob.companyName = "阿里巴巴" + + vm.postJob() + + if isEditing { + hud.show("修改成功") + if !naviPath.isEmpty { + naviPath.removeLast() + } + } else { + hud.show("发布成功") + vm.jobs.append(vm.job) + tabbarVM.selectedTab = "job" + } + vm.draftJob = PLJob() + } +} diff --git a/IOS_study/PostPLJobIView.swift b/IOS_study/PostPLJobIView.swift new file mode 100644 index 0000000..117a03e --- /dev/null +++ b/IOS_study/PostPLJobIView.swift @@ -0,0 +1,300 @@ +// +// PostPLJobIView.swift +// IOS_study +// +// Created by CC-star on 2025/6/28. +// + +import SwiftUI + +struct PostPLJobIView: View { + var isEditing = false //默认新增工作 + + @AppStorage("workPlaceName") var workPlaceName = "" + @AppStorage("workProvince") var workProvince = "" + @AppStorage("workCity") var workCity = "" + @AppStorage("workContact") var workContact = "" + @Environment(PLJobViewModel.self) var vm + @Environment(HUD.self) var hud + @Environment(TabBarViewModel.self) var tabbarVM + @Binding var naviPath: NavigationPath + @State var WordNum20 = 20 + @State var WordNum50 = 50 + @State var WordNum100 = 100 + @State var WordNum200 = 200 + @State var WordNum300 = 300 + @State var WordNum500 = 500 + + var draftJob: PLJob{ vm.draftJob } + + var incalidMsg: String? { + if draftJob.title.isBlank { + return "工作名称未写" + } + if draftJob.hourlyWage < 20 || draftJob.hourlyWage > 1000{ + return "基本时给太低或太高" + } + if draftJob.placeName.isBlank { + return "工作地点未填" + } + if draftJob.city.isBlank { + return "城市未填" + } + if draftJob.contact.isBlank { + return "联系方式未填" + } + if draftJob.title.count > WordNum50 { return "工作名称不能超过\($WordNum50)" } + if draftJob.otherTime.count > WordNum100 { return "时间说明不能超过\($WordNum100)" } + if draftJob.otherNeed.count > WordNum300 { return "工作要求不能超过\($WordNum300)" } + if draftJob.workContent.count > WordNum500 { return "工作内容不能超过\($WordNum500)" } + if draftJob.otherBenefit.count > WordNum300 { return "工作福利不能超过\($WordNum300)" } + if draftJob.placeName.count > WordNum50 { return "工作地点名称不能超过\($WordNum50)" } + if draftJob.city.count > WordNum20 { return "工作地城市不能超过\($WordNum20)" } + if draftJob.contact.count > WordNum200 { return "联系方式不能超过\($WordNum200)" } + return nil + } + + var body: some View { + @Bindable var vm = vm + ScrollView(showsIndicators: false) { + VStack(spacing: kStackSpacingS) { + // MARK: - 基本信息 + VStack(alignment: .leading,spacing: kStackSpacing) { + HStack { + VStack(alignment: .leading) { + Text("工作业种").littleTStyle() + Picker("工作业种", selection: $vm.draftJob.business) { + ForEach(kBusinessArr, id: \.self){ + Text($0) + } + }.pStyle() + } + + VStack(alignment: .leading) { + Text("工作名称").littleTStyle() + TextField("IOS程序员", text: $vm.draftJob.title).tfStyle() + } + } + VStack(alignment: .leading) { + Text("是否报税").littleTStyle() + Picker("是否报税", selection: $vm.draftJob.tax){ + ForEach(kTaxArr, id: \.self){ + Text($0) + } + }.pickerStyle(.segmented) + }.padding(.bottom,5) + HStack { + Text("基本时给:").littleTStyle() + TextField("", value: $vm.draftJob.hourlyWage, formatter: NumberFormatter()) + .size18ab().multilineTextAlignment(.center).kerning(2) + .keyboardType(.numberPad).tfStyle().frame(width: 88) + Text("请填写最低时给").size13s() + } + HStack { + Text("招聘人数:").littleTStyle() + Picker("招聘人数", selection: $vm.draftJob.wantNum) { ForEach(kWantNumArr, id: \.self){ + Text("\($0)人")//字符串插值 + } + }.pStyle() + Text("请填写最多招聘人数").size13s() + } + + }.padding().bg() + // MARK: - 工作时间 + VStack(alignment: .leading,spacing: kStackSpacingS) { + Text("工作时间").littleTStyle() + HStack { + HStack(spacing: 3) { + Picker("起始小时", selection: $vm.draftJob.startHour) { ForEach(0..<25) {Text("\($0)")} + }.pStyle() + Text(":").conlonStyle() + Picker("起始分钟", selection: $vm.draftJob.startMin) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")} + }.pStyle() + + Image(systemName: "minus") + + Picker("结束小时", selection: $vm.draftJob.endHour) { ForEach(0..<25) {Text("\($0)")} + }.pStyle() + Text(":").conlonStyle() + Picker("结束分钟", selection: $vm.draftJob.endMin) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")} + }.pStyle() + } + Button { + withAnimation { + vm.draftJob.has2.toggle() + } + } label: { + Image(systemName: vm.draftJob.has2 ? "minus.circle.fill" : "plus.circle.fill") + .foregroundStyle(vm.draftJob.has2 ? .red : .accent) + }.font(.title2).padding(.horizontal,3) + } + + if(vm.draftJob.has2){ + HStack(spacing: 3) { + Picker("第二个起始小时", selection: $vm.draftJob.startHour2) { ForEach(0..<25) {Text("\($0)")} + }.pStyle() + Text(":").conlonStyle() + Picker("第二个起始分钟2", selection: $vm.draftJob.startMin2) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")} + }.pStyle() + + Image(systemName: "minus") + + Picker("第二个结束小时2", selection: $vm.draftJob.endHour2) { ForEach(0..<25) {Text("\($0)")} + }.pStyle() + Text(":").conlonStyle() + Picker("第二个结束分钟2", selection: $vm.draftJob.endMin2) { ForEach([0,30], id: \.self) {Text($0 == 0 ? "00":"\($0)")} + }.pStyle() + } + } + + Text("追加说明").littleTStyle() + TextField("具体时间段可以详谈", text: $vm.draftJob.otherTime, axis: .vertical).tfStyleMultiS() + }.push(to: .leading).padding().bg() + // MARK: - 工作要求 + VStack(alignment: .leading,spacing: kStackSpacing) { + HStack { + VStack(alignment: .leading) { + Text("经验要求").littleTStyle() + Picker("经验要求", selection: $vm.draftJob.needExp) { ForEach(kNeedExpArr, id: \.self) {Text($0)} + }.pStyle() + } + VStack(alignment: .leading) { + Text("学历要求").littleTStyle() + Picker("学历要求", selection: $vm.draftJob.needEdu) { ForEach(kNeedEduArr, id: \.self) {Text($0)} + }.pStyle() + } + } + HStack { + VStack(alignment: .leading) { + Text("语言要求").littleTStyle() + Picker("学历要求", selection: $vm.draftJob.needLan) { ForEach(kNeedLanArr, id: \.self) {Text($0)} + }.pStyle() + } + VStack(alignment: .leading) { + Text("框架要求").littleTStyle() + Picker("学历要求", selection: $vm.draftJob.needFrame) { ForEach(kNeedFrameArr, id: \.self) {Text($0)} + }.pStyle() + } + } + VStack(alignment: .leading) { + Text("更多要求/加分项(选填)").littleTStyle() + TextField("", text: $vm.draftJob.otherNeed, axis: .vertical).tfStyleMultiM() + } + }.padding().bg() + // MARK: - 工作内容 + VStack(alignment: .leading) { + Text("工作内容(选填)").littleTStyle() + TextField("", text: $vm.draftJob.workContent, axis: .vertical).tfStyleMultiM() + + }.padding().bg() + // MARK: - 公司福利 + VStack(alignment: .leading,spacing: kStackSpacing) { + Text("公司福利").littleTStyle() + HStack { + Text("交通费报销").onTapGesture { + vm.draftJob.moveFee.toggle() + }.toggleStyle(isTap: vm.draftJob.moveFee) + Text("不加班").onTapGesture { + vm.draftJob.noOverTime.toggle() + }.toggleStyle(isTap: vm.draftJob.noOverTime) + } + VStack(alignment: .leading) { + Text("更多福利(选填)").littleTStyle() + TextField("", text: $vm.draftJob.otherBenefit, axis: .vertical).tfStyleMultiL() + } + }.padding().bg() + // MARK: - 工作地点 + VStack(alignment: .leading,spacing: kStackSpacing) { + VStack(alignment: .leading) { + Text("工作地名称").littleTStyle() + TextField("", text: $vm.draftJob.placeName, axis: .vertical).tfStyle() + + if !workPlaceName.isEmpty { + HStack(spacing: 3) { + Text("上次填的:").size13s() + Button { + vm.draftJob.placeName = workPlaceName + } label: { + Text(workPlaceName).labelBG() + } + } + } + } + HStack { + Text("省份").littleTStyle() + Picker("省份", selection: $vm.draftJob.province) { ForEach(kProvinceArr, id: \.self) {Text($0)} + }.pStyle() + if !workProvince.isEmpty { + HStack(spacing: 3) { + Text("上次填的:").size13s() + Button { + vm.draftJob.province = workProvince + } label: { + Text(workProvince).labelBG() + } + } + } + + } + HStack { + Text("城市").littleTStyle() + TextField("", text: $vm.draftJob.city, axis: .vertical).tfStyle().frame(width: 115) + if !workCity.isEmpty { + HStack(spacing: 3) { + Text("上次填的:").size13s() + Button { + vm.draftJob.city = workCity + } label: { + Text(workCity).labelBG() + } + } + } + } +// Button { +// workProvince = province +// workCity = city +// workProvince = province +// } label: { +// Text("存本地") +// }.btnStyle() +// + }.padding().bg() + // MARK: - 应聘方式 + VStack(alignment: .leading,spacing: kStackSpacing){ + Text("联系方式/应聘方式").littleTStyle() + HStack { + Picker("联系方式种类", selection: $vm.draftJob.contactType) { + ForEach(kContactTypeArr, id: \.self) {Text($0)} + }.pStyle() + TextField("", text: $vm.draftJob.contact, axis: .vertical).tfStyle() + } + if !workContact.isEmpty { + HStack(spacing: 3) { + Text("上次填的:").size13s() + Button { + vm.draftJob.contact = workContact + } label: { + Text(workContact).labelBG() + } + } + } + + Text("据调查,99%的人才都喜欢使用微信联系").size13().red() + }.padding().bg() + + // MARK: - 提交按钮 + Button { +// hud.show("提交成功") + postJob() + } label: { + Text("提交").appleStyle() + }.padding().bg() + }.tc().bg2() + postBottomEView().bg() + } + } +} + +#Preview { + PostPLJobIView(naviPath: .constant(NavigationPath())) +} diff --git a/IOS_study/Preview Content/Preview Assets.xcassets/Contents.json b/IOS_study/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/IOS_study/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/IOS_study/TaBarView.swift b/IOS_study/TaBarView.swift new file mode 100644 index 0000000..aec0ce7 --- /dev/null +++ b/IOS_study/TaBarView.swift @@ -0,0 +1,27 @@ +// +// TaBarView.swift +// IOS_study +// +// Created by CC-star on 2025/6/29. +// + +import SwiftUI + +struct TaBarView: View { + @Environment(TabBarViewModel.self) var vm + var body: some View { + @Bindable var vm = vm + TabView(selection: $vm.selectedTab) { + Tab("工作", systemImage: "yensign.circle", value: "job") { + PLJobsView().toolbarBackground(.visible, for: .tabBar) + } + Tab("雇佣", systemImage: "plus.circle", value: "postJob") { + PostJobView().toolbarBackground(.visible, for: .tabBar) + } + } + } +} + +#Preview { + TaBarView() +} diff --git a/IOS_study/TaBarViewModel.swift b/IOS_study/TaBarViewModel.swift new file mode 100644 index 0000000..2d3041c --- /dev/null +++ b/IOS_study/TaBarViewModel.swift @@ -0,0 +1,12 @@ +// +// TaBarViewModel.swift +// IOS_study +// +// Created by CC-star on 2025/7/1. +// + +import Foundation + +@Observable class TabBarViewModel { + var selectedTab = "job" +}