MyWearablesViewController

MyWearablesViewController

我有一个名为“ MyWearablesViewController”的类,其中我已将协议写为

 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
}


但是没有给我的代表打电话。请指导我我想念什么?

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

最佳答案

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

好消息是,您对代表的理解是绝对正确的!但坏消息是您误解了一个更基本的概念。

您说过,在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答案的评论,您希望将委托设置为HomeViewController实例。

要访问HomeViewController实例,必须首先获取选项卡栏控制器,并使用viewControllers属性。

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


请注意,我假设您的HomeViewController嵌入在导航控制器中。如果没有,请改用此方法:

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


最后,您可以设置委托:

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

07-26 09:38