// // 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(ProfileViewModel.self) var profileVM @Environment(HUD.self) var hud @Environment(TabBarViewModel.self) var tabbarVM @State var scrollView: ScrollViewProxy?// = nil @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 invalidMsg: String? { if !profileVM.user.cIsUploaded { return "需要先上传公司信息" } 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 ScrollViewReader { scrollView in ScrollView(showsIndicators: false) { VStack(spacing: kStackSpacingS) { VStack { if profileVM.user.cIsUploaded { Text(profileVM.user.cName).subTStyleL() } else { Text("请先至个人页添加公司").size15().red() } }.push(to: .center).padding().bg() // 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() } }.id("title") 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) { 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() } } } } 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() } } } } // 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: - 提交按钮 postBtn // // withAnimation {//withAnimation -> 动画 // Button("点击") { // scrollView.scrollTo("title",anchor: .top)//返回到id为title的view的top(id为title的view的顶部) // } // } }.tc().bg2() postBottomEView().bg() }.navigationBarBackButtonHidden(isEditing).navigationBarTitleDisplayMode(.inline) .toolbar { if isEditing { ToolbarItem(placement: .principal) { Text("编辑兼职").tc().bold() } ToolbarItem(placement: .topBarLeading) { Button { if !naviPath.isEmpty {//检查是否为最后一页 naviPath.removeLast()//返回上一页 } } label: { Image(systemName: "chevron.left").secondary().padding(.horizontal,6) } } } } .onAppear() { self.scrollView = scrollView } } } } #Preview { PostPLJobIView(naviPath: .constant(NavigationPath())) }