从非父视图控制器分配代理

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 操作和资源?

ReleaseMutex:从非同步代码块调用对象同步方法

从另一个片段的其他视图控制片段的视图

从非视图快速请求地理定位

更改非父模型的 inlineformset 中模型字段的查询集

当 iOS 应用程序从非活动/挂起状态被召回时,何时刷新视图