以编程方式更改 TabViewController 中的选定选项卡

Posted

技术标签:

【中文标题】以编程方式更改 TabViewController 中的选定选项卡【英文标题】:Changing Selected Tab in TabViewController Programmatically 【发布时间】:2016-12-15 05:44:02 【问题描述】:

我的***视图控制器中有一个带有两个按钮和一个容器视图的 OS Mac 应用程序。我用选项卡视图控制器替换了链接到容器视图的视图控制器。我想使用***视图控制器中的按钮切换选项卡。我让它接近工作的唯一方法是设置按钮操作如下:

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

instantiate 调用似乎有效,因为当我添加第三个选项卡时,计数从 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
  

这是来自上面链接的解决方案的答案。它在链接到控件的控制器中工作正常,但在主控制器按钮操作方法中不工作。这让我觉得我已经实例化了该类的第二个实例。

【问题讨论】:

【参考方案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
        
    

【讨论】:

【参考方案2】:

添加计时器解决了切换标签的直接问题。我通过使用稍微修改过的委派模式版本解决了让按钮进行切换的问题。

代码显示在我关于让它工作的问题中:Obtaining a View Controller Reference

【讨论】:

我想您必须添加计时器,因为您使用的是viewDidLoad,下面我将我的解决方案发布给他人和我自己

以上是关于以编程方式更改 TabViewController 中的选定选项卡的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式在 Xcode 中的视图控制器之间移动用户?

如何通过以编程方式将根(选项卡 ViewController)从子选项卡设置为未实例化的不同 VC

当输入的值以编程方式更改时触发更改事件

以编程方式更改高度约束

以编程方式更改 MediaController 图标

以编程方式更改系统日期