gpt4 book ai didi

ios - 如何将堆栈中的 1 个以上的 View Controller 委托(delegate)给 View Controller ?

转载 作者:行者123 更新时间:2023-11-28 05:55:31 27 4
gpt4 key购买 nike

场景:我有一个显示另一个 View Controller (vc2) 的 View Controller (vc1)。然后 vc2 呈现 vc3。如何将 vc1 设置为 vc3 的委托(delegate)?

情况:在 vc3 中,我打算返回到 vc1 并让它执行一些代码。但是,由于 vc3 实例是在 vc2 中创建的,vc1 没有从 vc1 到 vc3 的直接链接。

这是我要实现的目标的简化图:

vc1

let vc2Instance = vc2()
navigationController?.pushViewController(vc2Instance)

class vc1: UIViewController, tellVC1ToDoSomethingDelegate {

func vc1DoSomething(withThis: String) {
// for instance: present another VC not currently in stack
let randomVC = RandomVC()
}
}

vc2

let vc3Instance = vc3()
navigationController?.pushViewController(vc3Instance)

vc3

protocol tellVc1ToDoSomethingDelegate() {
func vc1DoSomething(withThis: String)
}

class vc3: UIViewController {
weak var vc1Delegate: tellVC1ToDoSomethingDelegate?

func pushRandomVCWithString(myString: String) {
// code to dismiss view controllers up to vc1 in stack
if let vcStack = self.navigationController?.viewControllers{
self.navigationController?.popToViewController(vcStack[vcStack.count - 2], animated: true)

vc1Delegate.vc1DoSomething(withThis: myString)
}
}

这是我的问题:如果我将 vc1 标记为 vc2 的委托(delegate)(堆栈中只有 1 个 VC),我将简单地键入

let vc2Instance = vc2()
vc2Instance.vc1Delegate = self

当 vc1 中不存在 vc3 的实例时,如何访问 self(vc1 的)?将委托(delegate)从 vc3 链接到 vc2 然后链接到 vc1 是唯一的出路吗?我想当中间有几个 vc 时,这会很难看。

最佳答案

有两种方法,一种是委托(delegate),另一种是通知。

  1. 委派:

    如您所问,您正在尝试这个。只是:

    • 在 vc2 和 vc3 中创建一个委托(delegate)变量。
    • 在vc1中创建vc2的对象时,将self传递给vc2的委托(delegate)变量。
    • 在vc2中创建vc3的对象时,将self.delegate传递给vc3的delegate变量。
    • 现在,当您在 vc3 中调用方法时,例如 self.delegate?.anyMethod() 将在 vc2 和 vc3 中都得到调用。
  2. 通知:

    从通知开始,您可以广播带有 vc3 一些信息的自定义类型的通知。并且可以添加观察者来观察 vc1 或任何其他 vc 中的通知,您将收到带有传递数据的调用。了解有关通知的更多信息 here

作为我个人的建议,第一个对你的情况更好。

关于ios - 如何将堆栈中的 1 个以上的 View Controller 委托(delegate)给 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51589804/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com