TableView reloadData 没有重新加载?

Posted

技术标签:

【中文标题】TableView reloadData 没有重新加载?【英文标题】:TableView reloadData not reloading? 【发布时间】:2014-10-03 10:30:38 【问题描述】:

首先我使用 initWithCoder 初始化表格,然后将数据加载到单元格中。当数据源更改(这是 Web 服务)时,我希望重新加载表。只是为了测试我连接了按钮操作并添加了[self.tableView reloadData]

但是表没有重新加载,但数据源已更改。如果我转到不同的视图并返回表视图,则会显示新数据。有什么建议吗?

- (id)initWithCoder:(NSCoder *)aDecoder 

    self = [super initWithCoder:aDecoder];
    if (self) 
        self.titleList = [[SearchModel alloc] init];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        [self.titleList load: ^(id json) 
            [self.tableView reloadData];
            [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
        ];
    
    return self;



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    self.tableView.delegate = self;
    self.tableView.dataSource = self;

    static NSString *CellIdentifier = @"title";
    TitleDetailCell *cell = nil;
    Model *title = nil;

     title = [self.titleList get:indexPath.row];

    if (cell == NULL)

    
        cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];


        [cell movieTitleLabel].text = [title get:@"title"];
        [[cell movieImageView] setImageWithURL: thumbnail];
    
    return cell;

【问题讨论】:

为什么要在 cellForRowAtIndexPath 方法中设置表委托和数据源?如果一开始就没有设置数据源,它将永远不会被调用 我应该在哪里设置?我试着把它放在 viewDidApper 重新加载数据之前的任何位置。 viewDidLoad: 是通常的地方。或者如果您使用 IB - 最好在那里设置委托和数据源 【参考方案1】:

两件事:

    您不对到达回调 (json) 的数据做任何事情。您是否需要将其存储在任何地方以便在表格视图中显示? 回调发生在主线程还是后台线程?如果你在做 UI 的东西,你需要确保它在主线程上

【讨论】:

数据存储在@property (nonatomic, strong) SearchModel *titleList;回调是什么意思。数据源在模型类上更改的主线程上没有更改,我从 initWithCoder 调用的那个。我知道数据何时更改,所以我正在调用重新加载表。 您的意思是模型将数据加载到自身中?回调是指您传递给load: 的块。您似乎将该评论中的类和线程混为一谈? 没有。那是模型类的实例。模型类从 Web 服务获取数据并返回数据。在 initWithCoder 中调用模型类。我是初学者,请澄清主线程是什么意思,我应该如何知道数据是否加载到主线程上。谢谢【参考方案2】:

当时initWithCoder: 被称为tableView 尚未创建。

将代码从initWithCoder:移动到viewDidAppeare:,在主线程上重新加载数据,应该会有所帮助:

self.titleList = [[SearchModel alloc] init];
        [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
        [self.titleList load: ^(id json) 
            // Log data to see is data is ready
             NSLog(@"%@",[title get:@"title"]);
            // Reload table on the main thread
            dispatch_async(dispatch_get_main_queue(), ^
                [self.tableView reloadData];
                [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
            );
        ];

【讨论】:

在这种情况下不会加载任何内容。我想表格的数据需要在视图出现之前准备好。所以我将代码放置到 viewWillApper 但没有重新加载。 是的,在调用 reloadData 之前需要准备好数据。在 viewDidAppeare 中加载数据,记录它以确保数据准备就绪并重新加载表视图。如果日志显示您缺少数据,则您的问题出在 SearchModel 类中。 我将代码放在 viewDidApper 中,数据加载正常。但是重新加载仍然不起作用。 @JamesDouglas 在主线程上重新加载表,请参阅更新的答案。

以上是关于TableView reloadData 没有重新加载?的主要内容,如果未能解决你的问题,请参考以下文章

使用 tableView.reloadData() 重新加载 TableView 的问题

tableView.reloadData() 如何正确重新加载数据?

tableView.reloadData() 不起作用,可能没有在主线程上调用

tableView.reloadData() 和 DispatchQueue 无法在不同的视图控制器中重新加载 tableview

UITableview 没有重新加载

iOS:tableView.reloadData() 不能快速工作