2015-07-19 97 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