self.tableView reloadData 在 UISplitViewController master detail 应用程序中不起作用



我试图使用delegate从详细信息ViewController中更新MasterViewController中的TableView。我从委托方法中调用了Reloaddata,但这并没有涉及。我仍然无法解决。

这是我在MasterViewController中的代表方法

- (void)updateScore:(DetailViewController *)controller withScore:(NSUInteger)score {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:_selectedIndexPath];
        NSLog(@"%@", cell.detailTextLabel.text);
        cell.detailTextLabel.text = [NSString stringWithFormat:@"Best score: %lu", (unsigned long)score];
        [self.tableView reloadData];
        NSLog(@"%@", cell.detailTextLabel.text);
}

来自nslog the cell.detailtextlabel.text已更新,但TableView未重新加载

谢谢

您需要确保您的视图控制器是tableview委托和dataSource

如果您使用的是故事板,则在Connections Inspector下,您的桌面需要将视图控制器设置为DataSource和DeTaSource

如果您只想在ViewDidload方法中的ViewController.m文件中执行此操作,则可以使用这些行

self.tableView.delegate = self;
self.tableView.dataSource = self;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        //other init 
    }
   if(_selectedIndexPath.row == indexPath.row && _selectedIndexPath.section == indexPath.section){
        cell.detailTextLabel.text = [NSString stringWithFormat:@"Best score: %lu", (unsigned long)score];
    }
}

您可以尝试在上面的cellForRowAtIndexPath中移动代码,然后tableview reloaddata

  1. [self.tableView reloadData]更新表中的所有可见单元格。它调用numberOfSectionsInTableViewnumberOfRowsInSectioncellForRowAtIndexPath等。换句话说:它完全更新了桌子。
  2. 设置单元素内容的唯一正确方法是将其设置在cellForRowAtIndexPath中。代码:

    if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; //other init}
    

    从iOS 6开始,如果您使用故事板,就永远不会被打电话。

因此,您的代码:

  1. 使用不正确的方法来设置单元格内容。
  2. [self.tableView reloadData]清除所有设置。

解决方案:

  1. __strong ivarproperty中保存score
  2. 致电[self.tableView reloadData]。它在适当的时间调用cellForRowAtIndexPath
  3. cellForRowAtIndexPath方法中设置新的score

建议:使用:

dispatch_async(dispatch_get_main_queue(), ^(){ [self.tableView reloadData]; });

从代表快速返回,而不要等到表格更新。

最新更新