Initial Commit

This commit is contained in:
cc 2025-07-01 11:41:38 +08:00
commit 98116f3a36
61 changed files with 2513 additions and 0 deletions

View File

@ -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 = "<group>"; };
94790B352E1179A600BF0A09 /* CUser.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CUser.swift; sourceTree = "<group>"; };
94790B362E1179A600BF0A09 /* GView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GView.swift; sourceTree = "<group>"; };
94790B382E1179A600BF0A09 /* View+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+.swift"; sourceTree = "<group>"; };
94790B392E1179A600BF0A09 /* View+Label.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Label.swift"; sourceTree = "<group>"; };
94790B3A2E1179A600BF0A09 /* View+Style.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+Style.swift"; sourceTree = "<group>"; };
94790B3E2E1179A600BF0A09 /* OverflowGrid.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OverflowGrid.swift; sourceTree = "<group>"; };
94790B402E1179A600BF0A09 /* PLJob.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJob.swift; sourceTree = "<group>"; };
94790B422E1179A600BF0A09 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = "<group>"; };
94790B442E1179A600BF0A09 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
94790B452E1179A600BF0A09 /* IOS_studyApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IOS_studyApp.swift; sourceTree = "<group>"; };
94790B462E1179A600BF0A09 /* PLJobCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobCellView.swift; sourceTree = "<group>"; };
94790B472E1179A600BF0A09 /* PLJobsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobsView.swift; sourceTree = "<group>"; };
94790B482E1179A600BF0A09 /* PLJobView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobView.swift; sourceTree = "<group>"; };
94790B492E1179A600BF0A09 /* PostPLJobIView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostPLJobIView.swift; sourceTree = "<group>"; };
94790B4A2E1179A600BF0A09 /* TaBarView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaBarView.swift; sourceTree = "<group>"; };
94790B5D2E117AD800BF0A09 /* PLJobViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PLJobViewModel.swift; sourceTree = "<group>"; };
94790B5F2E11846F00BF0A09 /* Foundation+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Foundation+.swift"; sourceTree = "<group>"; };
94790B612E118B3600BF0A09 /* PostPLJobIView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PostPLJobIView+.swift"; sourceTree = "<group>"; };
94790B632E118CB400BF0A09 /* HUDView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HUDView.swift; sourceTree = "<group>"; };
94790B652E129CC500BF0A09 /* GType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GType.swift; sourceTree = "<group>"; };
94790B672E137DB300BF0A09 /* PostJobView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PostJobView.swift; sourceTree = "<group>"; };
94790B692E13820500BF0A09 /* TaBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TaBarViewModel.swift; sourceTree = "<group>"; };
94790B6B2E13879300BF0A09 /* PLJobView+.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "PLJobView+.swift"; sourceTree = "<group>"; };
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 = "<group>";
};
94790B3B2E1179A600BF0A09 /* Extension */ = {
isa = PBXGroup;
children = (
94790B5F2E11846F00BF0A09 /* Foundation+.swift */,
94790B382E1179A600BF0A09 /* View+.swift */,
94790B392E1179A600BF0A09 /* View+Label.swift */,
94790B3A2E1179A600BF0A09 /* View+Style.swift */,
);
path = Extension;
sourceTree = "<group>";
};
94790B3F2E1179A600BF0A09 /* Library */ = {
isa = PBXGroup;
children = (
94790B632E118CB400BF0A09 /* HUDView.swift */,
94790B3E2E1179A600BF0A09 /* OverflowGrid.swift */,
);
path = Library;
sourceTree = "<group>";
};
94790B412E1179A600BF0A09 /* Model */ = {
isa = PBXGroup;
children = (
94790B402E1179A600BF0A09 /* PLJob.swift */,
);
path = Model;
sourceTree = "<group>";
};
94790B432E1179A600BF0A09 /* Preview Content */ = {
isa = PBXGroup;
children = (
94790B422E1179A600BF0A09 /* Preview Assets.xcassets */,
);
path = "Preview Content";
sourceTree = "<group>";
};
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 = "<group>";
};
947A93AA2DEEE882002E0937 = {
isa = PBXGroup;
children = (
94790B4B2E1179A600BF0A09 /* IOS_study */,
947A93B42DEEE882002E0937 /* Products */,
);
sourceTree = "<group>";
};
947A93B42DEEE882002E0937 /* Products */ = {
isa = PBXGroup;
children = (
947A93B32DEEE882002E0937 /* IOS_study.app */,
);
name = Products;
sourceTree = "<group>";
};
/* 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 */;
}

View File

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

View File

@ -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
}

View File

@ -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>top-level-items</key>
<array/>
</dict>
</plist>

View File

@ -0,0 +1,5 @@
<?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">
<array/>
</plist>

View File

@ -0,0 +1,78 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "947A93B22DEEE882002E0937"
BuildableName = "IOS_study.app"
BlueprintName = "IOS_study"
ReferencedContainer = "container:IOS_study.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "947A93B22DEEE882002E0937"
BuildableName = "IOS_study.app"
BlueprintName = "IOS_study"
ReferencedContainer = "container:IOS_study.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<BuildableProductRunnable
runnableDebuggingMode = "0">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "947A93B22DEEE882002E0937"
BuildableName = "IOS_study.app"
BlueprintName = "IOS_study"
ReferencedContainer = "container:IOS_study.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>

View File

@ -0,0 +1,22 @@
<?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>IOS_study.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>0</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
<dict>
<key>947A93B22DEEE882002E0937</key>
<dict>
<key>primary</key>
<true/>
</dict>
</dict>
</dict>
</plist>

View File

@ -0,0 +1,18 @@
{
"colors" : [
{
"color" : {
"platform" : "universal",
"reference" : "systemIndigoColor"
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
},
"properties" : {
"localizable" : true
}
}

View File

@ -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
}
}

View File

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

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

@ -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
}
}

View File

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

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 955 B

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 MiB

View File

@ -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","电话","邮件","其他"]

View File

@ -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

View File

@ -0,0 +1,12 @@
//
// GType.swift
// IOS_study
//
// Created by CC-star on 2025/6/30.
//
import Foundation
enum Navi1 {
case PLJobsToPLJob,PLJobToEdit
}

View File

@ -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)
}

View File

@ -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)
}
}

View File

@ -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 }
}

View File

@ -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)//paddingbackground
.radius()
}
func labelBG2() -> some View{
size13()
.tc()
.med()
.padding3()
.background(Color.labelBG2)//paddingbackground
.radius()
}
func labelPP() -> some View{
size13()
.purple()
.med()
.padding3()
.background(Color.purple.opacity(0.18))//paddingbackground
.radius()
}
func labelWA() -> some View{
size11()
.white()
.padding1()
.background(Color.accent)
.radius()
}
func labelWAL() -> some View{
size14()
.white()
.med()
.padding3()
.background(Color.accent)
.radius()
}
}

View File

@ -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)
}
}

View File

@ -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
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -0,0 +1,38 @@
import SwiftUI
import Combine
//
extension View {
func hud<Content: View> (isPresented: Binding<Bool>, @ViewBuilder content: () -> Content) -> some View {
ZStack {
self
if isPresented.wrappedValue {
HUDView(content: content).zIndex(1)
}
}.animation(.default, value: isPresented.wrappedValue)
}
}
struct HUDView<Content: View>: 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() //
}
}
}

View File

@ -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
}
}
}
}

View File

@ -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:"阿里巴巴")
}

View File

@ -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)
}

View File

@ -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()
}
}
}

253
IOS_study/PLJobView.swift Normal file
View File

@ -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()))
//}

View File

@ -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()
}
}

View File

@ -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()
}

View File

@ -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)
}
}
}

View File

@ -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()
}
}

View File

@ -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()))
}

View File

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

27
IOS_study/TaBarView.swift Normal file
View File

@ -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()
}

View File

@ -0,0 +1,12 @@
//
// TaBarViewModel.swift
// IOS_study
//
// Created by CC-star on 2025/7/1.
//
import Foundation
@Observable class TabBarViewModel {
var selectedTab = "job"
}