是否可以在UITableView中刷新单个UITableViewCell?

时间:2010-12-15 09:14:01

标签: objective-c uitableview

我使用UITableView进行自定义UITableViewCell。 每个UITableViewCell都有2个按钮。单击这些按钮将更改单元格内UIImageView的图像。

是否可以单独刷新每个单元格以显示新图像? 任何帮助表示赞赏。

9 个答案:

答案 0 :(得分:317)

获得单元格的indexPath后,您可以执行以下操作:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

在Xcode 4.6及更高版本中:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

当然,你可以设置你喜欢的动画效果。

答案 1 :(得分:33)

我尝试过调用-[UITableView cellForRowAtIndexPath:],但这不起作用。但是,以下内容适用于我。我allocrelease NSArray用于严密的内存管理。

- (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}

答案 2 :(得分:19)

夫特:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 1)

    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
    tableView.endUpdates()
}

答案 3 :(得分:18)

reloadRowsAtIndexPaths:很好,但仍然会强制UITableViewDelegate方法触发。

我能想象的最简单的方法是:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];

重要在主线程上调用configureCell:实现,因为它不适用于非UI线程(同样的故事与reloadData / reloadRowsAtIndexPaths:)。有时添加可能会有所帮助:

dispatch_async(dispatch_get_main_queue(), ^
{
    [self configureCell:cell forIndexPath:indexPath];
});

同样值得避免在当前可见视图之外完成的工作:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
    ....
}

答案 4 :(得分:16)

如果您使用自定义TableViewCells,则使用通用

[self.tableView reloadData];    

除非您离开当前视图并且返回,否则无法有效回答此问题。第一个答案也没有。

要成功重新加载第一个表格视图单元而不切换视图,请使用以下代码:

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

插入以下刷新方法,调用上述方法,以便您可以自定义重新加载顶部单元格(如果您愿意,还可以重新加载整个表格视图):

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

现在您已将其排序,在viewDidLoad内添加以下内容:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

您现在拥有了一个自定义刷新表功能,可以重新加载顶部单元格。要重新加载整个表,请添加

[self.tableView reloadData];到您的新刷新方法。

如果您希望每次切换视图时重新加载数据,请执行以下方法:

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}

答案 5 :(得分:6)

斯威夫特3:

tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()

答案 6 :(得分:4)

只是使用iOS 6中的新文字语法稍微更新这些答案 - 您可以对单个对象使用Paths = @ [indexPath],或者为多个对象使用Paths = @ [indexPath1,indexPath2,...]。

就个人而言,我发现数组和字典的字面语法非常有用并且节省了大量时间。一方面,它更容易阅读。并且它消除了在任何多对象列表的末尾需要nil,这一直是个人的bugaboo。我们都有风车倾斜,是吗? ; - )

以为我会把它扔进去。希望它有所帮助。

答案 7 :(得分:1)

这是带有Swift 5的UITableView扩展:

^abc(.|\n|\r)*xyz$

致电

import UIKit

extension UITableView
{    
    func updateRow(row: Int, section: Int = 0)
    {
        let indexPath = IndexPath(row: row, section: section)

        self.beginUpdates()
        self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic)
        self.endUpdates()
    }

}

答案 8 :(得分:0)

我需要升级单元,但我想要关闭键盘。 如果我使用

let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()

键盘消失