You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS SwiftUI:DatePicker弹窗后自动聚焦时间文本失效问题

解决SwiftUI macOS菜单栏弹窗DatePicker后续无法自动聚焦的问题

问题分析

首次点击菜单栏图标弹出窗口时,DatePicker能自动聚焦,但后续弹窗时无法触发,原因是窗口从隐藏状态重新显示时,onAppear不会再次执行,导致聚焦逻辑没有被触发。

解决方案

通过FocusState管理焦点状态,并监听窗口激活事件,每次窗口成为活跃窗口时强制聚焦DatePicker:

  1. 定义焦点状态变量:
@FocusState private var isDatePickerFocused: Bool
@State private var notificationTime = Date()
  1. 给DatePicker添加聚焦绑定:
DatePicker("Schedule Notifications", selection: $notificationTime, displayedComponents: .hourAndMinute)
    .datePickerStyle(.stepperField)
    .focused($isDatePickerFocused)
  1. 添加窗口激活监听与首次加载聚焦:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 10:04:57