トップレベルの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 番目のインスタンスをインスタンス化したと思います。