试图了解代表

时间:2016-09-02 10:23:49

标签: ios objective-c swift uiviewcontroller delegates

我有一个名为'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”

2 个答案:

答案 0 :(得分:0)

在你推送MyWearablesViewController之前,你的MoreViewController准备了segue

。你可以这样做

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)