From d7762fee3f73f2b4d784413ebfe519b1d7030e37 Mon Sep 17 00:00:00 2001 From: JGZ_YES Date: Wed, 12 Aug 2026 13:39:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20iOS:=20SettingsView=20?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E6=89=80=E6=9C=89=20UIKit=20=E4=BE=9D?= =?UTF-8?q?=E8=B5=96=EF=BC=8C=E6=97=B6=E9=97=B4=E9=80=89=E6=8B=A9=E5=99=A8?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E7=BA=AF=20SwiftUI=20DatePicker=20+=20sheet?= =?UTF-8?q?=20=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AreYouSleeping/Views/SettingsView.swift | 87 +++++++++++++++---------- 1 file changed, 53 insertions(+), 34 deletions(-) diff --git a/AreYouSleeping/Views/SettingsView.swift b/AreYouSleeping/Views/SettingsView.swift index 5f34e4a..8e58c1a 100644 --- a/AreYouSleeping/Views/SettingsView.swift +++ b/AreYouSleeping/Views/SettingsView.swift @@ -4,6 +4,9 @@ struct SettingsView: View { @EnvironmentObject var store: Store @State private var showAgreement = false @State private var showStyleSettings = false + @State private var showTimePicker = false + @State private var isBedPicker = false + @State private var pickerDate = Date() var body: some View { NavigationStack { @@ -35,7 +38,7 @@ struct SettingsView: View { Text(TimeUtil.fmt(store.bedtimeMinutes)).foregroundColor(.blue) } .contentShape(Rectangle()) - .onTapGesture { pickTime(isBed: true) } + .onTapGesture { showTimePickerSheet(isBed: true) } HStack { Text("目标起床时间") @@ -43,7 +46,7 @@ struct SettingsView: View { Text(TimeUtil.fmt(store.waketimeMinutes)).foregroundColor(.blue) } .contentShape(Rectangle()) - .onTapGesture { pickTime(isBed: false) } + .onTapGesture { showTimePickerSheet(isBed: false) } } header: { Text("作息") } // MARK: - 提醒 @@ -98,9 +101,57 @@ struct SettingsView: View { .sheet(isPresented: $showAgreement) { AgreementView() } + .sheet(isPresented: $showTimePicker) { + timePickerSheet + .presentationDetents([.height(300)]) + } } } + // MARK: - 时间选择器(纯 SwiftUI) + private var timePickerSheet: some View { + VStack(spacing: 16) { + HStack { + Button("取消") { showTimePicker = false } + Spacer() + Text(isBedPicker ? "就寝时间" : "起床时间").font(.headline) + Spacer() + Button("确定") { + let cal = Calendar.current + let h = cal.component(.hour, from: pickerDate) + let m = cal.component(.minute, from: pickerDate) + let v = h * 60 + m + if isBedPicker { + store.bedtimeMinutes = v + BedtimeReminder.schedule(store: store) + } else { + store.waketimeMinutes = v + } + store.save() + showTimePicker = false + } + .bold() + } + .padding(.horizontal) + + DatePicker("", selection: $pickerDate, displayedComponents: .hourAndMinute) + .datePickerStyle(.wheel) + .labelsHidden() + } + .padding(.top, 12) + } + + private func showTimePickerSheet(isBed: Bool) { + isBedPicker = isBed + let curMin = isBed ? store.bedtimeMinutes : store.waketimeMinutes + let cal = Calendar.current + var comps = cal.dateComponents([.year, .month, .day], from: Date()) + comps.hour = curMin / 60 + comps.minute = curMin % 60 + pickerDate = cal.date(from: comps) ?? Date() + showTimePicker = true + } + private var shareText: String { let code = store.controlCode let webLink = "http://api.ausleep.parlz.com/control?code=\(code)" @@ -110,36 +161,4 @@ struct SettingsView: View { \(webLink) """ } - - private func pickTime(isBed: Bool) { - let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene - guard let root = scene?.windows.first?.rootViewController else { return } - - let vc = UIViewController() - let picker = UIDatePicker() - picker.datePickerMode = .time - picker.preferredDatePickerStyle = .wheels - picker.frame = CGRect(x: 0, y: 50, width: 320, height: 216) - - let alert = UIAlertController(title: isBed ? "就寝时间" : "起床时间", message: nil, preferredStyle: .alert) - alert.view.addSubview(picker) - - alert.addAction(UIAlertAction(title: "确定", style: .default) { _ in - let cal = Calendar.current - let h = cal.component(.hour, from: picker.date) - let m = cal.component(.minute, from: picker.date) - let v = h * 60 + m - if isBed { - store.bedtimeMinutes = v - BedtimeReminder.schedule(store: store) - } else { - store.waketimeMinutes = v - } - store.save() - }) - alert.addAction(UIAlertAction(title: "取消", style: .cancel)) - - alert.view.frame = CGRect(x: 0, y: 0, width: 320, height: 350) - root.present(alert, animated: true) - } }