获取视图控制器引用

Posted

技术标签:

【中文标题】获取视图控制器引用【英文标题】:Obtaining a View Controller Reference 【发布时间】:2016-12-16 21:48:00 【问题描述】:

我阅读了很多问题并没有回答这个问题。有些适用于 Ojective C。有些适用于 ios。那些接近我需要的没有工作。

我已经建立了一个委托协议。它不起作用。问题是未设置委托变量。我需要对活动控制器的引用。

委托人

protocol SwitchTabDelegate: class 
  func selectTab(tab: Int)


class ViewController: NSViewController 

  weak var delegate: SwitchTabDelegate?

  override func viewDidLoad() 
    super.viewDidLoad()
  

  @IBAction func selectCompositions(_ sender: NSButton) 

    if let delegate = self.delegate 
      delegate.selectTab(tab: 2)
    
    else 
      print("self.delegate is nil")
    
    print("delegate called")
  

代表

class TabViewController: NSTabViewController, SwitchTabDelegate 

  var viewController : ViewController?;

  override func viewDidLoad() 
    super.viewDidLoad()
    //viewController = storyboard?.instantiateController(withIdentifier: "viewController") as? ViewController
   // viewController?.delegate = self
  // print(viewController)
  

  func selectTab(tab: Int) 
    print("In the delegate")
    switchToDataTab()
  

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

  func switchToDataTabCont()
    self.selectedTabViewItemIndex = 2
  

委托人是主要的 NSViewContoller。在故事板上,它包含两个按钮和一个容器视图控制器。嵌入在容器视图控制器中的是 TabViewController,即被委托者。您可以在我试图获得参考的代表中看到。它确实得到了一个引用,大概是对新实例化的实例。我需要引用应用程序启动时启动的原始视图控制器。

回答

我在委托人中添加了以下代码:

override func prepare(for segue: NSStoryboardSegue, sender: Any?) 

  let controller = segue.destinationController as! TabViewController
  self.delegate = controller as SwitchTabDelegate
 

这不是按照设计模式应该如何工作的。委托人不应了解受委托人。我在这个问题上花费了太多时间,所以我要破解一下。

【问题讨论】:

【参考方案1】:

使用情节提要时,您希望在创建子项时“推送”对子项的引用,而不是从上游控制器中提取它们。这就是 -prepareForSegue:sender: 的用途。

【讨论】:

那么在父子之间使用协议是不合适的?我确实找到了 prepareForSegue 的示例并将其放入我的代码中。它从未被执行。该示例没有“do sequel”代码。我将在原始问题中添加我所拥有的内容。 使用 segue 解决了这个问题。我想保留我的协议,所以我将子引用拉到父级。

以上是关于获取视图控制器引用的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 拆分视图控制器 - 如何从主视图控制器内部获取指向详细视图控制器的指针(引用)?

在主视图控制器的子容器视图中获取 tableView 的引用

如何从自定义表格视图单元类中获取对表格视图控制器的引用

获取对当前堆栈上的视图控制器的引用

iOS如何获取对带有segue的storyboard容器中嵌入的视图控制器的引用?

在主视图控制器的子容器视图中获取tableView的引用