【问题标题】:How to reload and animate just one UITableView cell/row?如何仅重新加载一个 UITableView 单元格/行并为其设置动画?
【发布时间】:2011-07-22 01:52:28
【问题描述】:

如何仅重新加载一个单元格/行并为其设置动画? 现在我下载了一些文件。每次文件下载完成时,我称它为完成委托并调用 [tableview reload]。 但随后整个表重新加载。以及如何为表格设置动画,使其不会闪烁。例如淡入淡出效果。

问候马克斯

【问题讨论】:

    标签: objective-c cocoa-touch uitableview animation


    【解决方案1】:

    使用下面的UITableView实例方法:

    - (void)reloadRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation
    

    您必须指定要重新加载的NSIndexPaths 中的NSArray。如果你只是想重新加载。如果您只想重新加载一个单元格,那么您可以提供一个仅包含一个NSIndexPathNSArray。例如:

    NSIndexPath* rowToReload = [NSIndexPath indexPathForRow:3 inSection:0];
    NSArray* rowsToReload = [NSArray arrayWithObjects:rowToReload, nil];
    [myUITableView reloadRowsAtIndexPaths:rowsToReload withRowAnimation:UITableViewRowAnimationNone];
    

    您可以查看 UITableViewRowAnimation 枚举,了解所有可能的行刷新动画方式。如果您不想要任何动画,则可以使用值UITableViewRowAnimationNone,如示例中所示。

    与简单地获得您想要的动画效果相比,重新加载特定的行具有更大的优势。您还可以获得巨大的性能提升,因为只有您真正需要重新加载的单元格才会刷新、重新定位和重新绘制其数据。根据单元格的复杂性,每次刷新单元格时都会产生相当大的开销,因此减少刷新次数是必要的优化,应尽可能使用。

    【讨论】:

    • 使用新语法,您还可以执行以下操作:[UITableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
    • @JamesBedford 重新加载单个单元格。我需要在 - (void)reloadRowsAtIndexPaths 方法中写一些吗?
    • reloadRowsAtIndexPaths:withRowAnimation: 方法是 UITableView 的一种方法,您可以使用它来重新加载单个单元格(只需将单个单元格索引路径作为参数传递!)
    • 如何从单元格本身执行此操作?我有一个带有按钮的单元格视图子类,当我单击按钮时,我想从内部更新单元格,而不必在表格视图控制器中处理这个问题。我可以吗?
    • 您是否尝试过让单元格引用表格视图控制器,然后在其tableView 上调用reloadRowsAtIndexPaths:withRowAnimation:
    【解决方案2】:

    Swift 4 和 5

    对于表格视图

    let index = IndexPath(row: 0, section: 0)
    tableView.reloadRows(at: [index], with: .automatic)
    

    对于集合视图

    let index = IndexPath(item: 2, section: 0)
    collectionView.reloadItems(at: [index])
    

    【讨论】:

      【解决方案3】:

      如果只需要更新tableview单元格中的文字..

      UITableViewCell *cell = [_myTableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1]];
      
      cell.textLabel.text = [NSString stringWithFormat:@"%i", (int)_targetMaxDistanceSlider.value];
      

      【讨论】:

      • 感谢这有助于 RTT 实现,无需重新加载整个视图,只需重新加载文本。
      • 非常好的答案。
      【解决方案4】:

      Apple Document 用新语法完成它

      [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
      

      【讨论】:

        【解决方案5】:

        斯威夫特

        你可以使用

        let selectedIndexPath = IndexPath(item:0 , section: 0)
        self.tableView.reloadRows(at: [selectedIndexPath], with: .none)
        

        为了重新加载特定的单元格。

        【讨论】:

          【解决方案6】:

          要在给定的indexPaths 处重新加载tableView 中的特定单元格,您需要创建一个indexPaths数组,然后在tableView 上调用函数reloadRowsAtIndexPaths

          示例如下:

          斯威夫特 5:

          let indexPathsToReload = [indexPath1, indexPath2, indexPath3]
          tableView.reloadRows(at: indexPathsToReload, with: .none)
          

          目标 C:

          NSArray *indexPaths = @[indexPath1, indexPath2, indexPath3];
          [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
          

          NSArray *indexPaths = [NSArray arraywithobject:@"indexPath1", @"indexPath2", @"indexPath3",nil];
          [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
          

          【讨论】:

            猜你喜欢
            • 2017-08-05
            • 1970-01-01
            • 1970-01-01
            • 2021-03-21
            • 1970-01-01
            • 2013-04-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多