gpt4 book ai didi

ios - 为什么即使我完成了所有必要的步骤,我的代理人也没有工作?

转载 作者:行者123 更新时间:2023-11-28 07:23:41 25 4
gpt4 key购买 nike

我正在尝试使用委托(delegate)将数据数组传递给之前的 View Controller 。我已决定使用委托(delegate),因为我的展开转场不起作用(更多信息在 previous Stack Overflow post 中)。我已经创建了代理,执行所有必要的设置步骤。

我尝试了来自 this Stack Overflow question 的一些解决方案但很多答案都是针对我已经做过的事情。我尝试过的事情:

  • 重命名协议(protocol)。
  • 重命名委托(delegate)。
  • 使协议(protocol)不是 class 类型。
  • 强制展开委托(delegate)(这个很有趣——它导致我的应用程序崩溃,即使我知道委托(delegate)存在)。

我已经在 ViewControllerB 中创建了协议(protocol):

protocol ViewControllerBDelegate: class {
func viewControllerB(_ controller: UIViewController, didSelectArray array: [String])
}

我为具有弱引用循环的委托(delegate)创建了一个变量:

weak var viewControllerBDelegate: ViewControllerBDelegate?

我还在 didSelectRowAt 中从我的委托(delegate)中调用了一个函数:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let strArray = ["Hello", "World"]
viewControllerBDelegate?.viewControllerB(self, didSelectArray: strArray)
}

然后在 ViewControllerA 上:

class ViewControllerA: UIViewController, ViewControllerBDelegate

在 ViewControllerB 委托(delegate)函数中:

func viewControllerB(_ controller: UIViewController, didSelectArray array: [String]) {
print("An array of strings: \(array)")

controller.dismiss(animated: true, completion: nil)
}

在准备segue函数中:

if let viewControllerB = segue.destination as? ViewControllerB {
viewControllerB.viewControllerBDelegate = self
}

我希望委托(delegate)打印由 ViewControllerB 传递过来的数组的内容。但是它没有工作,而且与我的代码的目标不同, View Controller 并没有像预期的那样关闭。

最佳答案

你说:

Force unwrapping the delegate ... caused my app to crash

这将范围缩小到 viewControllerBDelegate 显然为 nil 的事实。所以问题是为什么。因此,在您的 prepare(for:sender:) 中添加一个断点,并确保您到达该行。如果不是,也许您展示了第二个 View Controller 而不是对其执行 segue?也许第二个 View Controller 嵌入在导航 Controller 中?根据最初提供的信息无法判断,但很可能是这样。

在评论中,您已确认第二个 View Controller 嵌入在导航 Controller 中。我知道你已经解决了这个问题,但为了 future 的读者,在那种情况下,prepare(for:sender:) 可能看起来像:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let nav = segue.destination as? UINavigationController,
let controller = nav.topViewController as? ViewControllerB {
controller.delegate = self
}
}

请原谅我将委托(delegate)属性的名称更改为简单的 delegate。作为惯例,我总是使用 delegate 除非在极少数情况下我需要在两个不同的委托(delegate)协议(protocol)之间消除歧义。但希望这能说明这个想法。

关于ios - 为什么即使我完成了所有必要的步骤,我的代理人也没有工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57281605/

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