2012-04-13 38 views
0

這似乎很荒謬,但我似乎無法將其整理出來。我需要在表視圖中插入一行以響應推送通知。實施應是越簡單從代碼中插入UITableView行

- (void)didSaveMessage:(Message*)message atIndex:(int)index 
{ 
//check to make sure I have an array to populate the table from... 
    if (self.messageManager.messages != nil) 
    { 
     self.indexRow = index; 
     NSLog(@"refresh table view from code"); 
     //remove a label that says "You have no messages"... 
     [[messageTable tableFooterView] removeFromSuperview]; 

     [messageTable beginUpdates]; 
     [messageTable insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:index inSection:0]] 
          withRowAnimation:UITableViewRowAnimationFade]; 
     [messageTable endUpdates]; 

     [self scrollToNewestMessage]; 

    } 
} 

當我收到遠程通知和它火時調用此方法。日誌語句打印。但是,UITableView不會更新。對我來說特別奇怪的是,如果我在IBAction中放入相同的代碼並將其鏈接到故事板中的刷新按鈕,它就會起作用。有沒有什麼特別的,我必須做的以編程方式更新UITableView?

+2

在調用此更新調用之前,請確保您的數據源已經更新了此新行的數據。我假設你知道在表格中動畫行並向數據源添加行是離散操作。 – 2012-04-13 23:05:59

+0

是的,謝謝。如果我在進行insertRowsAtIndexPaths:withAnimation調用之前記錄了我用於填充表的數組的計數,我會得到預期的更新計數。這部分似乎很好。另外,如果我的數據源在我嘗試插入一個新行時還沒有更新,我會得到一個NSException並崩潰,難道我不會? – geraldWilliam 2012-04-13 23:14:57

+0

好點,那會拋出一個'NSInternalInconsistencyException'。如果您在表格中的位置比添加的行更靠後,它會滾動到正確的行嗎?另外,我不確定是否將tableFooterView從其超級視圖中移除是一個好主意,因爲這是UITableView的視圖層次結構的一部分。我可能會將其設置爲「nil」。這似乎很奇怪,這個工程時,按下了一個按鈕... – 2012-04-13 23:18:32

回答

0

已解決。我正在調用方法從didReceiveRemoteNotification更新UI:在AppDelegate中,但是我的視圖控制器的另一個實例。所以我添加了一個viewController屬性到應用程序委託,在我的視圖控制器的視圖中設置了值的確實加載,現在它都工作。

1

嘗試發送表reloadData消息。這應該強制更新表視圖。

+0

沒有骰子。感謝您的答覆。我嘗試reloadData而不是和insertRowsAtIndexPaths:withAnimation :.結果是一樣的,沒有更新表。如果我遠離視圖並返回,則viewWillAppear中的reloadData調用將正確加載表的所有消息,正如我所提到的,它響應UIEvent而工作。但不是來自代碼。 – geraldWilliam 2012-04-13 23:06:36

0

它看起來很平凡,但是你傳遞給didSaveMessage的消息*是否可能是零?這將解釋爲什麼NSLog語句有效,並且我認爲在從IBAction進行測試時必須手動創建消息。

+0

感謝您的回覆。當我將消息記錄到控制檯時,它按預期存在。當從IBAction進行測試時,我仍然通過推送通知發送消息,只需使用刷新按鈕加載它,而不是響應didReceiveRemoteNotification: – geraldWilliam 2012-04-17 17:14:33