从非父视图控制器分配代理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从非父视图控制器分配代理相关的知识,希望对你有一定的参考价值。
我在Swift 4中与Protocols and Delegates一点苦苦挣扎。我会尽力描述/告诉你我拥有的东西。
主视图控制器:(MVC)1。我有Main Viewcontroller类(MVC)。 VC有一个选项属性,我想从另一个ViewController类(AVC)访问
class ViewController: UIViewController {
var options: Options?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "To Statements") {
// pass data to next view
let vc = segue.destination
let statementVC = vc as! StatementsViewController
statementVC.coreDataStack = coreDataStack
statementVC.currentPerson = currentPerson
}
}
extension ViewController: FormateStatementDelegate {
// formatting protocol
func addStatementFormat() -> Int {
// here is where I would use the options var that is found in the (MVC)
}
}
Statement ViewController:(SVC)2。我有一个从(MVC)调用的View Controller类Statement ViewController(SVC)。我正在使用准备segue func来设置此视图控制器(MVC)。
class StatementsViewController: UIViewController{
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "Add Statement") {
// pass data to next view
//print("segue to add statement")
let vc = segue.destination
let addStatementVC = vc as! AddStatementViewController
addStatementVC.coreDataStack = coreDataStack
addStatementVC.personName = currentPerson!.name!
}
}
AddStatement View Controller(AVC)3。我有第三个View Controller类AddStatement View Controller(AVC)从(SVC)调用。我也正在使用准备segue func来设置这个视图控制器(SVC)
这个类有一个我在(MVC)中定义的协议。
protocol FormateStatementDelegate {
func func addStatementFormat() -> Intmal
}
class AddStatementViewController: UIViewController{
var delegate FormateStatementDelegate! = nil
}
我感到困惑的地方是设置委托属性的位置。我见过的例子似乎在准备seguer函数时设置了delegate属性。但是因为(MVC)是符合FormateStatementDelegate协议的那个,因为它们没有父/子关系,我将如何在(AVC)中设置委托。我希望我以有意义的方式解释了这一点。
您的委托被声明为隐式解包的可选项:
class AddStatementViewController: UIViewController{
var delegate FormateStatementDelegate! = nil
}
小心一点。如果您忘记设置代理,应用程序将崩溃。 strong retention cycle也有可能导致内存泄漏。我使用的一般模式是将其声明为弱选项:
protocol FormateStatementDelegate: class {
...
}
class AddStatementViewController: UIViewController{
weak var delegate: FormateStatementDelegate?
func doSomething() {
delegate?.addStatementFormat() // This statement will do nothing if delegate is nil
}
}
现在问题:如果我正确理解你的问题描述,segue顺序是这样的:
ViewContorller -> StatementViewController -> AddStatementViewController
AddStatementViewController
有一个代表,ViewController
符合。您只需要在第二个视图控制器中保存对MainViewController
实例的引用:
class ViewController: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "To Statements") {
// pass data to next view
let vc = segue.destination
let statementVC = vc as! StatementsViewController
statementVC.coreDataStack = coreDataStack
statementVC.currentPerson = currentPerson
statementVC.formateStatementDelegate = self
}
}
}
class StatementViewController {
weak var formateStatementDelegate: FormateStatementDelegate?
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if (segue.identifier == "Add Statement") {
// pass data to next view
//print("segue to add statement")
let vc = segue.destination
let addStatementVC = vc as! AddStatementViewController
addStatementVC.coreDataStack = coreDataStack
addStatementVC.personName = currentPerson!.name!
addStatementVC.delegate = formateStatementDelegate
}
}
}
以上是关于从非父视图控制器分配代理的主要内容,如果未能解决你的问题,请参考以下文章
是否可以从非 REST 部分形式组合 REST 和非 REST 操作和资源?