【问题标题】:Reload UITableView from another tab从另一个选项卡重新加载 UITableView
【发布时间】:2012-12-06 21:37:03
【问题描述】:

我在尝试重新加载从 XML 源加载的 UITableView 单元格数据时遇到问题。

这里是场景。应用程序包含选项卡,其中一个有一个表格视图,它从 XML 文件中获取数据并且工作正常,但问题是当我想更改提要类别并从另一个选项卡更改 XML 时,我可以刷新当前的表格视图. 在我使用的标签之间切换

self.tabBarController.selectedIndex = 1;

并将类别提要传递给我要加载的另一个选项卡

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

它仍然加载相同的旧提要,而不是已通过的新提要。我检查了NSLog 并且提要值正确传递,但切换后它不会加载。

我还尝试从当前选项卡和类别选项卡中[self.tableView reloadData];,但它也不起作用。

【问题讨论】:

    标签: iphone objective-c uitableview ios5


    【解决方案1】:

    您可以使用 NSNotifications 从您的其他选项卡发送通知,并在您的 tableview 中有一个响应该通知的 oberver。

    例子

    (Tab 调用 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];
    }
    

    希望对你有帮助

    【讨论】:

    • @Mr.Crowley 这个答案真的对你有帮助吗?
    • 抱歉耽搁了。这是在 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; }
    • 在 viewController.m 中我使用[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTable:) name:@"XMLLoaded" object:nil]; 就像@mElling 提供代码并且nslog 返回空!它不会去那里,我不知道该怎么办......
    【解决方案2】:

    我只是猜测,没有看到其余的代码。

    我想你的表视图有一个 NSArray 数据源,你确定你的数组数据源也更新了吗?您的 xml 解析器或控制器是否将这些数据传输到 NSArray ?

    因为如果您调用 reloadData 它只会重新获取相同的数组。如果不更新,你会得到旧数据。

    【讨论】:

    • 重定向后我应该如何重置阵列?我猜主要问题是我的切换方法。当我使用self.tabBarController.selectedIndex = 1; 时,它会重定向并保留标签栏,但不会将新的提要字符串重新加载到 xml 源中。当我使用[self presentViewController:vidList animated:YES completion:nil]; 时,它会正确加载字符串,但会丢失标签栏,并且应用程序卡住并且无处可去,因为那里没有标签控件!
    【解决方案3】:

    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];
    }
    

    最后(正如 Leonardo 在下面指出的那样),在您的 viewDidUnload(或 ios6 的 dealloc)方法中,删除该类作为该通知的观察者。

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

    【讨论】:

    • 不错的代码,我还要补充一点,观察者也必须在 dealloc 中删除。
    • 感谢您的精彩解释。当用户触摸按钮到UITableView 和内部viewDidLoad 时,我将类别视图中的提要字符串传递给xmlParser 新的提要源。所以我认为NSNotification 不是我需要的。我在@Leonardo 上发表的评论中更准确地解释了我的问题。在此先感谢各位,你们真的很有帮助。
    • 如果您已验证您的 tableviewcontroller 类具有正确的数据,则可能只是时间问题(可能在新提要完成处理之前调用了 [self.tableview reloadData]。
    • 在使用self.tabBarController.selectedIndex = 1; 从第二个选项卡切换回来后不会进入 void reloadTable。我照你说的做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    相关资源
    最近更新 更多