2012-12-19 79 views
2

我無法重新加載從XML源加載的UITableView單元格數據。從另一個選項卡重新加載UITableView

這是場景。應用程序包含選項卡,其中一個有一個tableview從XML文件獲取數據,並且工作正常,但是當我想更改提要類別並從另一個選項卡更改XML時,我可以刷新當前的tableview 。 對於標籤之間切換我用

self.tabBarController.selectedIndex = 1; 

,並通過類別進到我想要加載

xmlParser = [[XMLParser alloc] loadXMLByURL:categories]; 

其他選項卡,它仍然加載相同的舊料,而不是新的具有已通過。我用NSLog進行了檢查,並且進給值正確通過,但切換後不會加載。

我也嘗試從當前標籤和類別標籤[self.tableView reloadData];,它也沒有工作。

回答

4

您可以使用NSNotifications從您的其他選項卡發送通知,並在您的tableview中有一個響應該通知的oberver。

(標籤調用的tableview的重裝),只要你想重新加載數據把這個代碼,所以當按下一個按鈕或下載完成等

NSNotification * notification = [NSNotification notificationWithName:@"updateTable" object:nil]; 
[[NSNotificationCenter defaultCenter] postNotification:notification]; 

在UITableViewController /具有UITableView的類,請執行以下操作。

在viewDidLoad中添加:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateTableView) name:@"backtolist" object:nil]; 

然後添加功能updateTableView

- (void) updateTableView: (NSNotification*) note 
{ 
    //Do whatever needs to be done to load new data before reloading the tableview 
    [_tableView reloadData]; 
} 

希望這有助於

+0

你能提供一個示例代碼嗎?非常感謝。 –

+0

@ Mr.Crowley這個答案對你有幫助嗎? – ophychius

+0

很抱歉延誤。這是在categoryviewcontroller.m' - (IBAction)btnOne:(id)sender {VideoViewController * vidList = [self.storyboard instantiateViewControllerWithIdentifier:@「vid」]; self.videoViewController = vidList; videoViewController.categories = @「http://test.com/feed/」; [[NSNotificationCenter defaultCenter] postNotificationName:@「XMLLoaded」object:nil]; [vidList.view reloadInputViews]; self.tabBarController.selectedIndex = 1; }' –

0

我只是猜測,沒有看過的代碼的其餘部分。

我想你的表視圖有一個NSArray數據源,你確定你的數組數據源也被更新了嗎?您的XML解析器或控制器是否將這些數據傳輸到NSArray?

因爲如果你調用reloadData它只是要重新獲取相同的數組。如果它沒有更新,你會得到舊的數據。

+0

重定向後應該如何重置數組? 主要問題是我的切換方法。 當我使用'self.tabBarController.selectedIndex = 1;'它重定向保持標籤欄,但不會重新加載新的提要字符串到xml源。 當我使用'[自我presentViewController:vidList動畫:是完成:無];'它正確加載字符串,但失去標籤欄和應用程序卡住,沒有去哪裏,因爲沒有選項卡控制那裏! –

0

Ophychius在他的建議中使用通知是正確的。我假設您在XML加載完成時擁有所有數據源,以便更新表視圖。這也假定你正在使用動態單元格。在加載XML的類中,在新XML完成加載時發佈通知。

[[NSNotificationCenter defaultCenter] postNotificationName:@"XMLLoaded" object:nil]; 

在表視圖類中,註冊爲從XML類發佈的通知的觀察者。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"XMLLoaded" object:nil]; 

正如您所看到的,當收到此通知時,它會調用選擇器。要麼在構建表的地方調用您的方法,要麼創建另一個簡單方法來調用reloadData。

-(void)reloadTable:(NSNotification *)notif 
{ 
    NSLog(@"In ReloadTable method. Recieved notification: %@", notif); 

    [self.tableView reloadData]; 
} 

最後(如萊昂納多指出下文),在你viewDidUnload(或對的dealloc iOS6的)的方法,除去類作爲該通知的觀察者。

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 

- (void)dealloc 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
+0

不錯的代碼,我還會補充說,觀察者也必須在dealloc中被移除。 – Leonardo

+0

感謝您的好解釋。當用戶觸摸按鈕到'UITableView'並在'viewDidLoad'內部給xmlParser提供新的提要源時,我從類別視圖傳遞提要字符串。所以我認爲'NSNotification'不是我所需要的。我在@Leonardo發表的評論中更準確地解釋了我的問題。先謝謝你們,你們真的很幫忙。 –

+0

如果您已驗證您的tableviewcontroller類具有正確的數據,那麼很可能只是一個時間問題([self.tableview reloadData]可能在新的提要完成處理之前調用) – mElling