1

我的顶级视图控制器中有一个带有两个按钮和一个容器视图的 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)
}

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

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

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 回答
0

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

该代码显示在我关于让它工作的问题中:获取视图控制器参考

于 2016-12-17T03:33:15.360 回答