2012-12-19 37 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