gpt4 book ai didi

ios - 尝试理解委托(delegate)

转载 作者:行者123 更新时间:2023-11-30 13:06:34 25 4
gpt4 key购买 nike

我有一个名为“MyWearablesViewController”的类,我在其中编写了一个协议(protocol)

 protocol MyWearablesViewControllerDelegate {
func myWearablesViewControllerDidFinishedChangingTracker(viewController: UIViewController)
}

我创建了一个全局变量

var delegate: MyWearablesViewControllerDelegate?

我已经在“MyWearablesViewController”中多次使用过此方法,例如

self.delegate?.myWearablesViewControllerDidFinishedChangingTracker(self)

现在我希望这能触发我的另一个名为“HomeViewController”的类中的方法,该类声明为

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource,MyWearablesViewControllerDelegate

在我的 ViewWillAppear 中我编写了这段代码

let myViewControllrer = MyWearablesViewController()
myViewControllrer.delegate = self

并将其功能实现为

func myWearablesViewControllerDidFinishedChangingTracker(viewController: UIViewController) {
// some code
}

但是我的委托(delegate)没有被调用。请指导我缺少什么?

编辑:“HomeViewController”位于 TabBarController 中,其中包含另一个名为“MoreViewController”的 ViewController,它基本上是一个 tableView。当用户点击“MoreViewController”中的单元格时推送“MyWearablesViewController”

最佳答案

好吧,好消息和坏消息......

好消息是,您对委托(delegate)的理解是绝对正确的!但坏消息是您误解了一个更基本的概念。

您说过在viewDidAppear中,您有以下代码:

let myViewControllrer = MyWearablesViewController()
myViewControllrer.delegate = self

您创建了 MyWearablesViewController 的新实例,并将 self 分配给 delegate 变量。到目前为止一切顺利。

但是,在 tableView(_:didSelectRowAtIndexPath:) 方法中,您执行了以下操作:

let myViewController = MyWearablesViewController()
navigationController?.pushViewController(myViewController, animated: true)

您创建了 MyWearablesViewController另一个实例!而且这个实例不是您在viewDidAppear方法中创建的实例!因此,这个新实例独立于您之前创建的其他实例。它的 delegate 属性实际上是 nil

那么,如何解决这个问题呢?

根据您对 NDoc 答案的评论,您希望将委托(delegate)设置为 HomeViewController 实例。

要访问 HomeViewController 实例,您必须首先获取标签栏 Controller ,并使用 viewControllers 属性。

// in the didSelectRowAtIndexPath method
let tabBarController = self.parentViewController!.parentViewController! as! UITabBarController
let homeVC = (tabBarController.viewControllers![0] as! UINavigationController).topViewController as! HomeViewController

请注意,我假设您的 HomeViewController 嵌入在导航 Controller 中。如果没有,请改用它:

let homeVC = tabBarController.viewControllers![0] as! HomeViewController

最后,您可以设置委托(delegate):

// in the didSelectRowAtIndexPath method
let myViewController = MyWearablesViewController()
myViewController.delegate = homeVC
navigationController?.pushViewController(myViewController, animated: true)

关于ios - 尝试理解委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39290108/

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