Swift 如何从多个选项卡视图创建到共享用户默认控制器的绑定

Swift 如何从多个选项卡视图创建到共享用户默认控制器的绑定,swift,cocoa,tabs,preferences,Swift,Cocoa,Tabs,Preferences,在我的应用程序中,我有一个选项卡式视图来显示和管理首选项。我想使用共享用户默认控制器来存储它们。因此,我通过interface builder创建了适当的绑定……不幸的是,我在第一个选项卡中创建的绑定可以工作,而在其他选项卡中创建的绑定不能工作。控制台没有显示任何错误消息,因此我不知道问题出在哪里。有人能帮我理解我做错了什么吗 如果这有帮助,我可以看到共享用户默认控制器有效地放置在第一个选项卡视图场景中。我尝试将其移动到选项卡式视图(显示各种选项卡栏项的视图),但如果这样做,绑定甚至在第一个选项

在我的应用程序中,我有一个选项卡式视图来显示和管理首选项。我想使用共享用户默认控制器来存储它们。因此,我通过interface builder创建了适当的绑定……不幸的是,我在第一个选项卡中创建的绑定可以工作,而在其他选项卡中创建的绑定不能工作。控制台没有显示任何错误消息,因此我不知道问题出在哪里。有人能帮我理解我做错了什么吗


如果这有帮助,我可以看到共享用户默认控制器有效地放置在第一个选项卡视图场景中。我尝试将其移动到选项卡式视图(显示各种选项卡栏项的视图),但如果这样做,绑定甚至在第一个选项卡中也无法工作。。。那么,如何通过共享用户默认值控制器从所有选项卡视图中存储值呢?

我不能说这是一个bug还是预期的行为。我找到了一种方法,可以访问NSTabView多个选项卡中的共享用户默认值;以下是对我有效的方法:

在NSTabViewController子类中添加以下内容:

override func viewWillAppear() {  
    super.viewWillAppear()

    // make me the delegate of the Tab View
    tabView.delegate = self

    // give the initially selected tab a reference to the User Defaults
    tabView.selectedTabViewItem?.viewController?.representedObject = UserDefaults.standard
}

override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
    super.tabView(tabView, didSelect: tabViewItem)

    // give the newly selected tab a reference to the User Defaults
    tabViewItem?.viewController?.representedObject = UserDefaults.standard
}

然后在IB中的绑定中,选择您所在的选项卡作为“绑定到”,并将“模型密钥路径”设置为representedObject.your_default_密钥。如果需要,请适当设置“值转换器”。

我不能说这是错误还是预期行为。我找到了一种方法,可以访问NSTabView多个选项卡中的共享用户默认值;以下是对我有效的方法:

在NSTabViewController子类中添加以下内容:

override func viewWillAppear() {  
    super.viewWillAppear()

    // make me the delegate of the Tab View
    tabView.delegate = self

    // give the initially selected tab a reference to the User Defaults
    tabView.selectedTabViewItem?.viewController?.representedObject = UserDefaults.standard
}

override func tabView(_ tabView: NSTabView, didSelect tabViewItem: NSTabViewItem?) {
    super.tabView(tabView, didSelect: tabViewItem)

    // give the newly selected tab a reference to the User Defaults
    tabViewItem?.viewController?.representedObject = UserDefaults.standard
}
然后在IB中的绑定中,选择您所在的选项卡作为“绑定到”,并将“模型密钥路径”设置为representedObject.your_default_密钥。如果需要,适当设置“值转换器”