添加UITableViewController栏按钮的观察者?

时间:2014-10-13 13:48:24

标签: ios uiviewcontroller uibarbuttonitem nsnotificationcenter

我有一个ViewController,可以启动多个NSTimers。我将这些NSTimers中的每一个作为观察者添加到UIApplicationDidEnterBackgroundNotification,以便在应用程序进入后台时我可以阻止它们。效果很好。

[[NSNotificationCenter defaultCenter]
addObserver:anotherTimer
selector:@selector(goBackground)
name:UIApplicationDidEnterBackgroundNotification
object:nil];

....

- (void) goBackground {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [self invalidate];
}

问题在于:我还为UITableViewController子类添加了一个条形按钮(" I"以获取信息)给每个ViewControllers。栏按钮打开另一个ViewController,显示有关该应用程序的信息。就像应用程序进入后台时一样,当用户点击栏按钮时,我希望所有NSTimers停止。

当用户点按条形按钮或NSTimers退出时,有没有办法让ViewController观察者出现?

1 个答案:

答案 0 :(得分:0)

答案比我想象的容易得多。执行此操作的正确方法是创建具有任意名称的新通知(例如,“infoButtonTapped”),并将所有NSTimers添加为该通知的观察者。通知调用与应用程序进入后台时发送的通知相同的方法(“goBackground”):

[[NSNotificationCenter defaultCenter]
addObserver:aTimer
selector:@selector(goBackground)
name:@"infoButtonTapped"
object:nil];

当用户点击信息时调用的方法Bar Button会以相同的名称发布通知:

[[NSNotificationCenter defaultCenter] postNotificationName:@"infoButtonTapped" object:self];

然后,当按下信息栏按钮时,将调用所有NSTimers的goBackground方法。

请注意,我为NSTimer创建了一个类别,其中包括setObservers,removeObservers和goBackground方法,这些方法可以很好地处理通知。

我还应该注意,只要其中一个NSTimers无效(无论是在goBackground还是其他地方),它必须首先作为所有通知的观察者被删除:

[aTimer removeObservers];
[aTimer invalidate];

否则,当发送其中一个通知时,应用会崩溃...