我有一个名为“ 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)