1

トップレベルのView Controllerに2つのボタンとContainer Viewを備えたOS Macアプリがあります。Container View にリンクされている View Controller を Tab View Controller に置き換えました。トップレベルのView Controllerのボタンを使用してタブを切り替えたいと思います。私がそれを機能させる唯一の方法は、次のようにボタンアクションを設定することです:

@IBAction func selectCompositions(_ sender: NSButton) {
  let tabViewController = self.storyboard?.instantiateController(withIdentifier: "tabViewController") as!NSTabViewController
  tabViewController.selectedTabViewItemIndex = 2
  let count = tabViewController.selectedTabViewItemIndex
  print(count)
}

3 番目のタブを追加したときにカウントが 1 から 2 に変わったため、インスタンス化呼び出しが機能しているように見えます。これは、設定する命令を追加する前のことです。とにかく、コードはタブを変更しません。ボタンをクリックせずにビューが表示されるため、コントローラーのインスタンス化は正しくないようです。呼び出しは、新しいオブジェクトをインスタンス化するのではなく、リンクを返すことのみを目的としていますか? それを行うためのより簡単な方法はありますか?

私はこの質問からの答えを試しました: Switch tab bar programmatically in Swift . tabViewController が未解決であるというエラーが生成されました。TabViewController のストーリーボード ID を tabViewController に設定しました。

アップデート

追加した:

self.selectedTabViewItemIndex = 0

私が作成してTabViewControllerにリンクしたクラスのviewDidLoadメソッドに。アプリを実行すると、インデックスが変更されますが、最後のタブ (2) がまだ表示されています。ウィンドウのタブ 0 をクリックすると、タブが変わりますが、インデックスの表示は変わりません。間違ったメソッドを呼び出しているようですが、他の人には適切ではないようです。

進捗

NSTabViewController クラスを次のように変更しました。

class TabViewController: NSTabViewController {

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
    print("In TabViewController")
    switchToDataTab()
  }

  func switchToDataTab() {
    Timer.scheduledTimer(timeInterval: 0.2, target: self, selector: #selector(switchToDataTabCont), userInfo: nil, repeats: false)
  }  

  func switchToDataTabCont(){
    self.selectedTabViewItemIndex = 2
  }
}

これは、上記のリンクされたソリューションからの回答です。コントロールにリンクされたコントローラーでは正常に機能しますが、メインコントローラーボタンのアクションメソッドでは機能しません。クラスの 2 番目のインスタンスをインスタンス化したと思います。

4

2 に答える 2

1

これが、タブの切り替え(および(再)保存)を解決した方法です

import Foundation
import Cocoa

class TabViewController: NSTabViewController {

    private var isLoading = false

    /// Use with Selected Index binding of NSTabView
    /// because setting binding direct to UserDefaults does not work
    @objc var selectedTabIndex: Int = 0 {
        didSet {
            if !isLoading {
                UserDefaults.standard.set(selectedTabIndex, forKey: "selectedTabIndex")
            }
        }
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        // set flag before selectedTabIndex binding fires to prevent setting overwrite
        isLoading = true
    }

    override func viewWillAppear() {
        super.viewWillAppear()

        if isLoading {
            selectedTabViewItemIndex = UserDefaults.standard.integer(forKey: "selectedTabIndex")
            isLoading = false
        }
    }
}
于 2020-08-03T18:18:22.717 に答える