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

时间:2016-12-15 05:44:03

标签: xcode cocoa swift3 xcode-storyboard nstabviewcontroller

我有一个OS Mac应用程序,在我的顶级View Controller中有两个按钮和一个Container View。我用Tab View Controller替换了链接到Container View的视图控制器。我想使用顶层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)
}

实例化调用似乎有效,因为当我添加第三个选项卡时,计数从1更改为2.这是在我添加指令设置之前。无论如何,代码不会更改选项卡。实例化控制器看起来并不正确,因为视图显示时没有单击按钮。该调用仅用于返回指向它的链接而不是实例化新对象吗?有没有更直接的方式去做呢?我尝试了this question的答案。它生成一个错误,说明tabViewController未解析。我已将TabViewController的storyboard id设置为tabViewController。

更新

我补充说:

self.selectedTabViewItemIndex = 0

到我创建的类中的viewDidLoad方法并链接到TabViewController。当我运行应用程序时,索引已更改,但仍显示最后一个选项卡(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 个答案:

答案 0 :(得分: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
        }
    }
}

答案 1 :(得分:0)

添加计时器修复了切换标签的直接问题。我通过使用稍微被黑客攻击的委托模式版本解决了让按钮进行切换的问题。我的my question中显示的代码是关于让它运行的。