2011-10-18 28 views
33

Tôi có rất nhiều dữ liệu và nhiều hàng trong tableView của mình. khi thay đổi dữ liệu tôi muốn cập nhật các ô hiển thị của mình trên màn hình, tôi thực sự không muốn sử dụng reloadData vì đó là một cuộc gọi tốn kém.iOS - Bảng làm mới UITableView có đúng cách không?

Chỉ bằng cách nào đó có thể cập nhật các ô hiển thị? Tôi đã thử gọi: beginUpdate & endUpdate trên bàn, nhưng điều đó không hoạt động mọi lúc?

Mọi đề xuất?

+0

Bạn có chắc chắn reloadData là đắt? Tôi hy vọng nó sẽ khá rẻ, miễn là bạn không sử dụng chiều cao biến. Nó sẽ truy vấn bạn có bao nhiêu phần trong bảng, bao nhiêu hàng trong mỗi phần và xóa bộ nhớ cache của nó. Nhưng các tế bào sẽ được nạp lại theo yêu cầu, có nghĩa là chỉ có các tế bào có thể nhìn thấy được nạp lại. –

+0

Nếu bạn định làm mới tất cả các ô _ invisible_ thì tải lạiData không được ** đắt tiền. – Nevin

+0

@StevenFisher Có trong trường hợp của tôi nó rất tốn kém, tôi có rất nhiều tính toán, chẳng hạn như chiều cao yêu cầu của các tế bào, và một số cuộc gọi web. Vì vậy, tôi có lẽ nên nói rằng nó là tốn kém cho trường hợp của tôi. – aryaxt

Trả lời

86

Bạn có thể:

[tableView reloadRowsAtIndexPaths:[tableView indexPathsForVisibleRows] 
       withRowAnimation:UITableViewRowAnimationNone]; 
+0

rất đẹp, cảm ơn. Đây là một giải pháp hoàn hảo đặc biệt khi nói đến tải lại một tế bào duy nhất. – aryaxt

+0

điều gì xảy ra nếu sau đó người dùng cuộn đến một ô không hiển thị khi cuộc gọi đó được thực hiện? anh ta sẽ thấy thông tin ngày tôi đoán? – dancl

+2

Các ô không hiển thị không được điền dữ liệu. Chúng được phổ biến khi chúng xuất hiện trên màn hình, thông qua các cuộc gọi lại nguồn dữ liệu của chế độ xem bảng. –

-1

Thử gọi 'deleteRowsAtIndexPaths', một phương pháp UITableView, ngay sau khi bạn xóa các mô hình từ nguồn dữ liệu của bạn. Ví dụ: nếu bạn đang xóa một hàng trong chế độ chỉnh sửa, bạn có thể viết một cái gì đó giống như mã bên dưới. Lưu ý rằng dòng đầu tiên trong 'nếu' tuyên bố loại bỏ các đối tượng từ các nguồn dữ liệu, và dòng thứ hai dọn dẹp bàn:

-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) { 

     [[[[[ItemsStore sharedStore] parameterArray] objectAtIndex:indexPath.section] objectForKey:@"data"] removeObjectAtIndex:indexPath.row]; 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 

    } 
} 
0

Đối Swift 3:

tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .none) 
Các vấn đề liên quan