0

設定ペインでの作業。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()
}
4

1 に答える 1

1

NSTabViewControllerおよびそのプロパティを使用できる必要がありselectedTabViewItemIndexます。これは、バインディングに準拠することが明確に文書化されています。

必要にselectedTabViewItemIndex応じて、選択したアイテムの適切なモデル オブジェクトにマップする上に構築される計算済みプロパティを作成できます。それを行うときは、クラスメソッドkeyPathsForValuesAffecting<Key>を必ず実装し["selectedTabViewItemIndex"]て、KVO が計算されたプロパティが変更されるたびにselectedTabViewItemIndex変更されたと見なすようにします。

( はKVO 準拠として文書化されていないため、既に試した計算されたプロパティを機能させるには、おそらくこれでは不十分ですNSTabView。 )selectedTabViewItem

于 2017-02-25T05:00:27.653 に答える