获取视图控制器参考 [英] Obtaining a View Controller Reference

查看:87
本文介绍了获取视图控制器参考的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我读了很多问题,没有回答这个问题。一些用于OjectiveC。一些用于iOS。

I read quite a few questions and answers no this problem. Some are for Ojective C. Some are for iOS. The ones that were close to what I need didn't work.

我已经建立了一个授权协议。没用问题在于未设置委托变量。我需要引用一个活动的控制器。

I've set up a protocol for delegation. It doesn't work. The problem is that delegate variable isn't set. I need the reference to an active controller.

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")
  }
}



Delegatee



Delegatee

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。在情节提要上,它包含两个按钮和一个Container视图控制器。嵌入在容器视图控制器中的是TabViewController,即委托者。您可以在委托人中看到我尝试获得参考的位置。它确实获得了引用,大概是对新实例化的实例的引用。我需要引用应用程序启动时旋转的原始视图控制器。

The delegatee is the main NSViewContoller. On the storyboard, it contains two buttons and a Container view controller. Embedded in the container view controller is the TabViewController, the delegatee. You can see in the delegatee where I tried to get a reference. It does get a reference, presumably to the newly instantiated instance. I need a reference to the original view controller that was spun up when the application started.

I向委托人添加了以下代码:

I added the following code to the delegator:

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

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

应该遵循设计模式。委托人应该不了解委托人。我在这个问题上花了太多时间,所以要做一个hack。

That's not how it should work following the design pattern. The delegator should have no knowledge of the delegatee. I've spent way too much time on this issue so a hack is going to do.

推荐答案

使用情节提要时,您想要在创建子级时推对子级的引用与从上游控制器中拉出它们。这就是-prepareForSegue:sender:的用途。

When using storyboards, you want to "push" references to children when they are created vs. pulling them from an upstream controller. This is what -prepareForSegue:sender: is used for.

这篇关于获取视图控制器参考的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆