設定ペインでの作業。NSTabView があります。タブは XIB から動的に作成されます。それらはすべて非常に似ていますが、同一ではありません。そのため、現在選択されているタブに応じて、いくつかの値を変更する (およびいくつかのコントロールを表示または非表示にする) 必要があります。
通常、NSTabView.selectedTabViewItem にバインドすることは可能であると考えられます。しかし、これは機能しません。なんで?値が更新されることはありません。
次に、よりクリエイティブになり、観察するバインディングに適切な値を返す算出プロパティを作成することを考えました。まだサイコロはありません。アプリの起動時にバインディングが評価され、更新されることはありません。
次に、乱雑にすることにし、デリゲートを作成して tabView の didSelect メソッドを実装しました。これにより、現在選択されているタブが、バインディングが監視できる保存されたプロパティに書き込まれます。
この最後のアプローチは機能しますが、非常にぎこちなく、汚れているように感じます。誰かがより良い方法を知っていますか?
編集: NSTabViewController を実装しようとしていますが、動作させることができません!
NSTabViewController を IB で作成した NSTabView オブジェクトに手動でバインドすると、すべてが適切に初期化されたように見えますが、タブは表示されません。そして、コントローラー内のすべてを初期化してから、NSTabViewController.tabView プロパティを介して NSTabView を割り当てようとすると、次のようになります。
A TabView managed by a TabViewController cannot have its delegate modified
do cumentationが指定する方法でそれをやろうとしているので、これは奇妙です. 実際、やろうとしてもTabViewController.tabView = NSTabView()
同じエラーが発生します。これはバグですか?
これが私のコードの関連部分全体です。
@IBOutlet weak var theTabView: NSTabView?
@IBOutlet weak var tabViewDelegate: NSTabViewController?
override func assignMainView() {
ControllersRef.sharedInstance.tabViewController = self.tabViewController
ControllersRef.sharedInstance.theTabView = self.theTabView
ControllersRef.sharedInstance.thePrefPane = self
let tabs = ["Internet", "URL Schemes", "Uniform Type Identifiers", "Applications"]
if let tabViewDelegate = self.tabViewDelegate {
for tab in tabs {
let newTab = NSTabViewItem(viewController: NSViewController.init()) // I tried doing it the other way around also, i.e. via addChildViewController() and tabItem(for:), but the result was the same.
newTab.label = tab
let newTabViewItemView = DRYView.init()
newTabViewItemView.nibName = "SWDAPrefpaneTabTemplate"
tabViewDelegate.addChildViewController(newTab.viewController!)
newTab.viewController!.view = newTabViewItemView
}
let views = tabViewDelegate.childViewControllers
tabViewDelegate.tabView = ControllersRef.sharedInstance.theTabView
}
super.assignMainView()
}