2015-07-19 82 views
0

我使用两个动作按钮创建一个UILocationNotification,一个呼叫睡眠并立即醒来。因此,一旦用户看到通知,如果他们按下现在唤醒应用程序将启动并执行一些代码由于某种原因,应用程序启动,然后拒绝执行代码带动作按钮的UILocalNotification按钮

FYI : The code for the UILocalNotification were implement and they are working, the only problem is when I pressed the wake up now button.

func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler:() -> Void) { 
    if notification.category == "options" { 
    if identifier == "Sleep"{ 

     println("sleep more lazy bumm") 
     } 
    else if identifier == "wakeup"{ 
     var object = ViewController() 
      object.wakeupnow() 

    } 
    } 

第二种方法我拿了,但它仍然没有工作

func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler:() -> Void) { 
    if notification.category == "options" { 
    if identifier == "Sleep"{ 

     println("sleep more lazy bumm") 
     } 
    else if identifier == "wakeup"{ 
      NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("wake"), name: UIApplicationWillEnterForegroundNotification, object: nil) 

    } 
    } 

    fun wake(){ 
     var alertview = UIAlertView() 
     alert.message = "Good job you are up now, so lets get to work" 
     alert.addButtonWithTitle("ok") 
     alert.cancelButtonIndex = 0 
     alert.show() 
    } 
+0

实际的错误是什么? – ozgur

+0

由于某些原因没有错误代码没有被调用 – Lamar

回答

0

请记住,应用程序:handleActionWithIdentifer:forLocalNotification:completionHandler:被调用在后台线程。如果你在UI中做任何事情,你需要在主队列上做。

此外,您必须尽快调用completionHandler块,否则系统会终止您的应用程序。

请参阅这个苹果文档:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/#//apple_ref/occ/intfm/UIApplicationDelegate/application:handleActionWithIdentifier:forLocalNotification:completionHandler

而且,在你的第一个例子你实例化一个视图控制器,并呼吁它的功能,但你实际上并没有呈现视图控制器 - 你是什么想要与视图控制器发生?您需要做些事情才能显示出来,这取决于您的应用程序的结构。例如,您可能想要在根控制器上以模态方式呈现它。或者你的意思是在你已经存在的ViewController上调用这个函数,在这种情况下,你需要在某个地方保留对它的引用,而不是在触发通知动作时实例化一个新函数。

在第二个示例中,您将自己添加为NSNotificationCenter的观察者而不是实际发布通知,因此当然,您的函数将永远不会被调用。如果你想利用这种方法,你需要提前打电话addObserver某个时候 - 在applicationDidFinishLaunching:,例如:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("wake"), name: "wakeup", object: nil) 

然后,在你handleActionWithIdentifier:功能,来电:

NSNotificationCenter.defaultCenter().postNotificationName("wakeup", object: nil) 

这应该导致您的正在调用wake函数。你还有试图显示从后台线程的警报视图,虽然这个问题,所以你需要来包装你的电话在dispatch_async:

func wake(){ 
    var alertview = UIAlertView() 
    alert.message = "Good job you are up now, so lets get to work" 
    alert.addButtonWithTitle("ok") 
    alert.cancelButtonIndex = 0 
    dispatch_async(dispatch_get_main_queue(),{ 
    alert.show() 
    }) 
} 

顺便说一句,UIAlertView中已经过时,应由UIAlertController用于替代iOS 8及以上。

+0

我没看过这个文档。你会采取什么办法来解决这个问题? – Lamar

+0

在你的第一个例子中,你正在创建一个ViewController并且调用一个函数,但是你实际上并没有呈现视图控制器 - 你想要怎么处理它?您需要做些事情才能显示出来,这取决于您的应用程序的结构。例如,您可能想要在根控制器上以模态方式呈现它。或者你的意思是在你已经存在的ViewController上调用这个函数,在这种情况下,你需要在某个地方保留对它的引用,而不是在触发通知动作时实例化一个新函数。 –

+0

是啊我知道第一种方法是不正确的..那为什么我尝试第二种方法 – Lamar