Tôi đang làm việc để sửa đổi một số mã nặng tay hiện có mà chỉ cần gọi [tableView reloadData]
về bất kỳ thay đổi nào, sử dụng các cập nhật bảng cụ thể hơn với các phương pháp chèn/xóa.Chèn UITableView: withRowAnimation: làm cho tất cả các ô bảng được yêu cầu
Tuy nhiên, tôi nhận được một số hành vi thực sự xấu khi làm như vậy. Trước đây, như người ta sẽ tưởng tượng, khi bảng được nạp, nó chỉ yêu cầu các ô cho các hàng được hiển thị tại thời điểm đó. Đây là hành vi khi sử dụng reloadData
.
Hiện tại, insertSections
đang được gọi, tất cả các ô được yêu cầu sau lần cập nhật đó, có thể là hàng trăm. Điều này dẫn đến các tế bào được tạo ra cho mỗi hàng, phá hủy hoàn toàn hàng đợi tế bào có thể tái sử dụng và tất cả chỉ là lãng phí. Tôi phải đang làm điều gì đó sai.
Sự thay đổi này là đơn giản, mã có kết quả trong tableView hỏi chỉ dành cho hàng có thể nhìn thấy:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
[tableView reloadData];
}
Mã mà kết quả trong tableView yêu cầu tất cả mọi thứ:
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context {
// ... ensure it's the right key
NSUInteger sectionCount = [self sectionCount];
NSIndexSet *indices = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, sectionCount)];
[tableView insertSections:indices withRowAnimation:UITableViewRowAnimationFade];
}
tôi có thể chuyển đổi trở lại và ra để xem thay đổi hành vi. Bực bội. Ý tưởng?
Thêm tiền thưởng chỉ để xem có ai có thông tin chi tiết hơn không.
beginUpdates/endUpdates không ảnh hưởng đến bất cứ điều gì và tôi không mong đợi nó, đây chỉ là một lệnh, không có gì thêm để kết hợp thành một bản cập nhật duy nhất.
Tôi nghĩ đây chỉ đơn giản là tác dụng phụ của mong muốn hoạt ảnh. Để có mọi thứ "trượt" vào, nó phải có mọi thứ để render. Trò chơi kết thúc.
Bạn xác định rằng tất cả các ô được yêu cầu cùng một lúc như thế nào? Không ai được dequeued? – Pascal
Tôi đã tạo một dự án thử nghiệm nhỏ và có thể tái tạo hành vi bạn đang quan sát. Nó thực sự là tò mò.Không thể là hoạt ảnh một mình vì hành vi là như nhau nếu bạn chỉ định UITableViewRowAnimationNone. Sự cố không xảy ra nếu vị trí chèn không hiển thị trên màn hình khi các phần chèn: withRowAnimation: được gọi. –