UILocalNotification with action按钮

时间:2015-07-19 18:27:36

标签: ios swift uilocalnotification

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

  

仅供参考:UILocalNotification的代码已实现且工作正常,唯一的问题是当我按下“立即唤醒”按钮时。

 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()
     }

1 个答案:

答案 0 :(得分:0)

请记住应用程序:handleActionWithIdentifer:forLocalNotification:completionHandler:在后台线程中调用。如果您在UI中执行任何操作,则需要在主队列中执行此操作。

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

请参阅Apple文档: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已被弃用,应该由适用于iOS 8及更高版本的UIAlertController取代。