Swift委托和协议

时间:2020-08-06 10:50:24

标签: ios swift

要使协议和代理正常工作,视图控制器是否必须在堆栈中相邻? 我的委托人调用的函数运行良好,直到我在发送数据的vc和接收数据的vc之间插入了一个新的vc。 (如果答案是“当然,你这个白痴!”我真的很放心,因为我真的很沮丧。)

1 个答案:

答案 0 :(得分:1)

大概你有这样的东西:

enter image description here

并且您的代码沿以下行运行:

protocol MyCustomDelegate: class {
    func myFunc(_ value: Int)
}

class VC1: UIViewController, MyCustomDelegate {
    
    func myFunc(_ value: Int) {
        print("value: \(value)")
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC2 {
            vc.delegate = self
        }
    }
}

class VC2: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
}

现在,您“插入新的VC”

enter image description here

因此,您在VC1中的代码不再与VC2保持联系...因此将不会设置委托。

一种方法(不一定是最好的方法)是:

  • VC1A中设置的VC1中添加一个委托var
  • VC1A导航到VC2时,将那个委托传递给

它可能看起来像这样:

protocol MyCustomDelegate: class {
    func myFunc(_ value: Int)
}

class VC1: UIViewController, MyCustomDelegate {
    
    func myFunc(_ value: Int) {
        print("value: \(value)")
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC1A {
            vc.delegate = self
        }
    }

}

class VC1A: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let vc = segue.destination as? VC1A {
            vc.delegate = self.delegate
        }
    }

}

class VC2: UIViewController {
    
    weak var delegate: MyCustomDelegate?
    
    func someAction(_ sender: Any?) -> Void {
        delegate?.myFunc(1)
    }
    
}

如果您的应用程序流程足够简单,这可能会起作用...但是,这并不理想,并且随着代码变得越来越复杂,容易出现问题。

您可能想重新考虑代码的结构以及如何管理数据。

相关问题