从AppDelegate发送NSNotification

时间:2013-12-08 15:15:39

标签: ios objective-c nsnotification

我想在我的AppDelegate.m中从此方法发送NSNotification(当点击UIButton时):

- (void)alertView:(UIAlertView *)alertView 
        clickedButtonAtIndex:(NSInteger)buttonIndex{

if (buttonIndex == 0){
    //cancel clicked ...do your action
    // HERE
}
}

..并在我UIViewControllers之一收到。我怎么能这样做?

编辑更多信息:我正在制作闹钟应用,当用户按下UIButton时,我想停止闹钟。我认为NSNotifications是从AppDelegate.m文件获取信息到ViewController.m文件的唯一方法吗?

2 个答案:

答案 0 :(得分:5)

您应该注册接收者对象以接受从通知中心发送的一些消息。

假设您有Obj A控制您的警报,值“stopAlarm”是可以停止警报的消息。您应该为“stopAlarm”消息创建一个观察者。

你可以这样做:

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(controller:)
                                             name:@"stopAlarm"
                                           object:nil];

现在,您应该创建一个管理此消息的方法控制器:

 - (void)controller:(NSNotification *) notification {

     if ([[notification name] isEqualToString:@"stopAlarm"]){

         //Perform stop alarm with A object
     }
  }

最后,您可以在代码中发送消息“stopAlarm”:

[[NSNotificationCenter defaultCenter]
     postNotificationName:@"stopAlarm"
     object:nil];

我希望这可能有所帮助。

编辑:

卸载UIViewController或应用程序终止时,您应该调用:

    [[NSNotificationCenter defaultCenter] removeObserver:self];

停止观察。 就是这样。

感谢热门修正。

答案 1 :(得分:0)

如果只有一个警报来管理计时器,您可能想要创建一个类 - 甚至可能是一个单例。这样您就可以从应用程序中的任何位置进行管理,而不是在视图控制器中进行管理看看:

http://dadabeatnik.wordpress.com/2013/07/28/objective-c-singletons-an-alternative-pattern/

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/Notifications/Articles/NotificationCenters.html

正如Hot Licks所提到的,你真的不想在不知道发生了什么的情况下跳进去。希望这些链接能帮助您朝着正确的方向前进。