2012-06-24 50 views
3

該應用收到UILocalNotification,但如果用戶在啓動時間位於UITableViewController,表格視圖(包含預定通知)不會重新加載。用戶必須退出該視圖並再次加載視圖,以便加載單元格,並且,由於通知已被觸發,它將不會顯示在該表視圖的任何單元格中。實時刷新表格視圖

問題是:如果用戶觸摸包含剛剛觸發的通知的特定tableView單元格,則應用程序崩潰,導致通知不再存在。

我已經在每個可能的地方實施了- (void)reloadData,但它仍然不能實時加載。

什麼是更好的解決方案呢?

其他細節,如何在通知顯示後推送特定視圖(當用戶在手機鎖定時滑動應用程序圖標)?

任何幫助將被真正的讚賞,因爲這是最後發佈我的第一個應用程序的最後細節。

+0

當你說reloadData被實現在每一個可能的地方,這並不清楚你的意思。在您正在實現的TableViewController子類的內部,在接受通知的代碼中,我期望您只需執行[self.tableView reloadData]就可以獲得所需內容。你有代碼可以分享嗎? –

+0

你能解釋你的崩潰的性質嗎? –

+0

我們可以看到一些代碼嗎? – self

回答

1

您描述的問題是由當前本地通知引起的:處理通知時,它仍在預定通知列表中,因此刷新表視圖將不起作用。解決這個問題是推遲重新加載表視圖,直到通知的處理之後,像

// In your app delegate 
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.localNotificationsController reloadDataIfNeeded]; 
    }); 
} 

// In your controller that shows the local notifications 
- (void)reloadDataIfNeeded 
{ 
    if (![self isViewLoaded]) return; 

    [self.tableView reloadData]; 
} 

你也可以從列表中刪除通知,如果你只使用通知只有火一次(這樣你爲確保通知無論如何都會消失):

// In your app delegate 
- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification 
{ 
    [application cancelLocalNotification:notification]; 
    [self.localNotificationsController reloadDataIfNeeded]; 
} 

關於你問題的第二部分(「我怎麼可以把一個特定視圖顯示後通知(當用戶滑動的應用程序圖標時手機被鎖定?「),有兩種情況如何通過本地通知激活應用程序。

  1. 您的應用程序被暫停,但仍在記憶中。然後選擇本地推送通知將使應用程序進入前景,-application:didReceiveLocalNotification:將被調用,並[application applicationState]UIApplicationStateInactive
  2. 您的應用程序沒有運行,即不暫停,而不是在內存中。然後你會收到在launchOptions本地通知在-application:didFinishLaunchingWithOptions:

    UILocalNotification *localNotification = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey]; 
    

    儘管文件說什麼,-application:didReceiveLocalNotification:可以在這種情況下調用。

因此,要顯示喚醒應用程序的通知,可以在這兩種情況下推送控制器。

+0

有沒有更好的答案。非常非常感謝你。 –