我正在编写一个多平台 SwifttUI 应用程序,并且希望当用户切换到另一个应用程序然后返回到我的应用程序时,Mac 版本将当前聚焦字段设置为特定字段。(为了完整起见,我将在 iOS 上执行相同的操作。)
为此,我尝试将此代码添加到我的视图的 init 中:
let didBecomeKeyNotification: NSNotification.Name = {
#if os(macOS)
return NSWindow.didBecomeKeyNotification
#else
return UIApplication.didBecomeKeyNotification
#endif
}()
NotificationCenter.default.addObserver(
forName: didBecomeKeyNotification,
object: nil,
queue: nil) { _ in
self.pointToFirstInputField()
}
其中将( var)pointToFirstInputField()
的值设置为当窗口再次成为关键窗口时我想要被选择的文本字段。focusedField
@FocusState
但是,这给了我一个错误Escaping closure captures mutating 'self' parameter
。
好的,我尝试将[weak self]
捕获列表添加到我的闭包中。这给了我一个错误:“‘weak’只能应用于类和类绑定协议类型,而不是‘WordleView’”
这是有道理的,因为 SwiftUI 视图是一个结构 - 一个值类型。
那么这里的解决方案是什么呢?
编辑:
(请注意,链接的“重复”问题不是重复的。我没有使用使用目标/操作的通知版本。我使用的是采用闭包的较新版本。我的问题是关于如何调用变异函数来自我的闭包正文。)
它也不会让我使用捕获组来处理弱变量。
controlActiveState
我使用环境值而不是通知来让它工作。在我的测试中,这在使应用程序处于活动状态时以及在两个窗口之间切换时在两个窗口之间内部运行时都有效。这是一个简单的实现