我有一个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
观察者出现?
答案 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];
否则,当发送其中一个通知时,应用会崩溃...