macOS SwiftUI:DatePicker弹窗后自动聚焦时间文本失效问题
解决SwiftUI macOS菜单栏弹窗DatePicker后续无法自动聚焦的问题
问题分析
首次点击菜单栏图标弹出窗口时,DatePicker能自动聚焦,但后续弹窗时无法触发,原因是窗口从隐藏状态重新显示时,onAppear不会再次执行,导致聚焦逻辑没有被触发。
解决方案
通过FocusState管理焦点状态,并监听窗口激活事件,每次窗口成为活跃窗口时强制聚焦DatePicker:
- 定义焦点状态变量:
@FocusState private var isDatePickerFocused: Bool @State private var notificationTime = Date()
- 给DatePicker添加聚焦绑定:
DatePicker("Schedule Notifications", selection: $notificationTime, displayedComponents: .hourAndMinute) .datePickerStyle(.stepperField) .focused($isDatePickerFocused)
- 添加窗口激活监听与首次加载聚焦:
VStack { // 其他无关元素 HStack{ // 其他无关元素 DatePicker("Schedule Notifications", selection: $notificationTime, displayedComponents: .hourAndMinute) .datePickerStyle(.stepperField) .focused($isDatePickerFocused) } } .onAppear { // 首次加载时聚焦 isDatePickerFocused = true } .onReceive(NotificationCenter.default.publisher(for: NSWindow.didBecomeKeyNotification)) { _ in // 每次窗口成为活跃窗口时重新聚焦 DispatchQueue.main.async { isDatePickerFocused = true } }
原理说明
FocusState用于跟踪DatePicker的焦点状态,focused(_:)修饰符将其与DatePicker绑定。onAppear处理首次弹窗时的聚焦逻辑。- 监听
NSWindow.didBecomeKeyNotification通知,确保每次点击菜单栏图标激活窗口时,重新触发聚焦操作,解决后续弹窗无法聚焦的问题。
内容的提问来源于stack exchange,提问作者Daggerpov
相关产品推荐
相关产品推荐

