我有一个名为'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”答案 0 :(得分:0)
。你可以这样做
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "pushSegue" {
let vc: MyWearablesViewControllerDelegate = segue.destinationViewController as! MyWearablesViewControllerDelegate
vc.delegate = self
}
}
答案 1 :(得分:0)
好的,好消息和坏消息......
好消息是,您对代表的理解绝对正确!但坏消息是你误解了一个更基本的概念。
你说在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)