Tải lại chế độ xem bảng mỗi lần bạn muốn thêm hoặc xóa hàng tạo trải nghiệm kém cho người dùng ứng dụng của bạn. Mặc dù thực tế đó không phải là cách hiệu quả để thực hiện tác vụ này, nó cũng có một số tác dụng phụ tiêu cực - các hàng đã chọn không được chọn sau khi tải lại và thay đổi không hoạt ảnh.
UITableView
có các phương pháp được tạo để thay đổi nội dung của chế độ xem bảng theo kiểu động.Đó là:
insertRowsAtIndexPaths:withRowAnimation:
moveRowAtIndexPath:toIndexPath:
deleteRowsAtIndexPaths:withRowAnimation:
Chú ý rằng các phương pháp này cho phép bạn xác định loại hình ảnh động mà sẽ được sử dụng khi xác định hoạt động được thực hiện - bạn không thể đạt được loại hành vi khi bạn sử dụng reloadData
để sửa đổi nội dung của xem bảng .
Hơn nữa, bạn thậm chí có thể kết hợp nhiều hoạt động xem bảng sử dụng phương pháp bổ sung của xem bảng (điều này là không cần thiết):
beginUpdates endUpdates
Chỉ cần quấn hoạt động bạn muốn thực hiện vào các cuộc gọi đến beginUpdates
và endUpdates
phương pháp và chế độ xem bảng sẽ tạo ra một hoạt ảnh cho tất cả các hoạt động đã được yêu cầu giữa các cuộc gọi beginUpdates
và endUpdates
để toàn bộ quá trình chuyển đổi đẹp hơn được tạo bởi một vài hoạt ảnh riêng biệt.
[self.tableView beginUpdates]
//calls to insert/move and delete methods
[self.tableView endUpdates]
Điều quan trọng là giữ cho trạng thái nguồn dữ liệu nhất quán với trạng thái nguồn được giữ bởi UITableView
. Vì lý do này, bạn phải đảm bảo rằng khi xem bảng bắt đầu thực hiện các hoạt động được yêu cầu thì nguồn dữ liệu của nó sẽ trả về các giá trị chính xác.
[self.tableView beginUpdates]
//calls to insert/move and delete methods
//operations on our data source so that its
//state is consistent with state of the table view
[self.tableView endUpdates]
Khi chế độ xem bảng bắt đầu hoạt động? Điều này phụ thuộc vào việc các hoạt động có đang ở trong khối hoạt ảnh được xác định bởi các phương thức beginUpdates
và endUpdates
hay không. Nếu có, chế độ xem bảng bắt đầu thực hiện các hoạt động sau khi gọi số endUpdates
. Mặt khác, chế độ xem bảng thực hiện các thao tác ngay sau khi thực hiện cuộc gọi để chèn/di chuyển hoặc xóa phương thức.
Khi bạn đang sử dụng các phương thức beginUpdates
và endUpdates
để thực hiện các thao tác trên bảng, bạn phải biết rằng trong trường hợp này, bảng được yêu cầu hoạt động và thực hiện theo thứ tự cụ thể. bạn đã thực hiện trên đối tượng xem bảng của bạn (Apple's documentation on this topic).
Điều quan trọng nhất cần nhớ là việc xóa tất cả các thao tác luôn được thực hiện trước tất cả các thao tác chèn. Ngoài ra, các thao tác xóa dường như được thực hiện theo thứ tự giảm dần (các thao tác cho các chỉ mục 3, 2, 1) khi thao tác chèn được thực hiện theo thứ tự tăng dần (các phép toán cho các chỉ mục 1, 2, 3). Hãy nhớ về điều này là quan trọng trong việc duy trì trạng thái nguồn dữ liệu của bạn nhất quán với nguồn dữ liệu được giữ bởi chế độ xem bảng.
Hãy dành một chút thời gian để phân tích thứ tự các hoạt động trên nguồn dữ liệu và chế độ xem bảng được trình bày trong ví dụ bên dưới.
dụ cuối cùng:
//initial state of the data source
self.numbers = [@[@(0), @(1), @(2), @(3), @(4), @(5), @(6)] mutableCopy];
//
//...
//
NSArray indexPathsToRemove = @[[NSIndexPath indexPathForRow:3 section:0].
[NSIndexPath indexPathForRow:0 section:0];
NSArray indexPathsToAdd = @[[NSIndexPath indexPathForRow:6 section:0],
[NSIndexPath indexPathForRow:5 section:0]];
[self.tableView beginUpdates];
[self.numbers removeObjectAtIndex:3];
[self.numbers removeObjectAtIndex:0];
[self.numbers insertObject:@(10) atIndex:4];
[self.numbers insertObject:@(11) atIndex:5];
[self.tableView insertRowsAtIndexPaths:indexPathsToAdd withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView deleteRowsAtIndexPaths:indexPathsToRemove withRowAnimation:UITableViewRowAnimationAutomatic];
[self.tableView endUpdates];
//final state of the data source ('numbers') - 1, 2, 4, 5, 6, 10, 11
Về cơ bản, bạn không thêm chúng vào chế độ xem, mà là thêm vào mô hình. Sau khi bạn làm điều đó, các tableviews reloadData phương pháp là bạn của bạn – HeikoG