获取视图控制器引用
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 的引用