【问题标题】:TableView reloadData not reloading?TableView reloadData 没有重新加载?
【发布时间】: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 - 最好在那里设置委托和数据源

标签: ios objective-c xcode uitableview reloaddata


【解决方案1】:

两件事:

  1. 您不对到达回调 (json) 的数据做任何事情。您是否需要将其存储在任何地方以便在表格视图中显示?
  2. 回调发生在主线程还是后台线程?如果你在做 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 在主线程上重新加载表,请参阅更新的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2016-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多