Tôi đã tạo một UITableview với các phần có thể nhấp được. Khi bạn bấm vào chúng,insertRowsAtIndexPaths: với scrollToRowAtIndexPath: khiến các phần UITableView bị ẩn không chính xác
- họ "mở rộng" để lộ các tế bào trong chúng
- cuộn phần nhấp lên đỉnh điểm.
tôi tính toán tất cả các indexpaths để chèn/xóa các tế bào cần thiết và sau đó chèn chúng với đoạn mã sau:
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
[self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
Chỉ có một vấn đề- các phần bên dưới phần chọn được ẩn. Ảnh chụp màn hình đầu tiên cho biết cách xem bảng. Màn hình thứ hai-shot cho thấy nó trông như thế nào.
Nếu bạn di chuyển lên (do các phần ẩn là offscreen) và sau đó di chuyển xuống, các phần ẩn được đưa trở lại (một lần nữa có thể nhìn thấy). Tôi đoán là tại sao điều này xảy ra như sau:
Hoạt ảnh chèn/xóa đang diễn ra cùng lúc với scrollToRowAtIndexPath
và điều này gây nhầm lẫn cho TableView. Nếu tôi đã không thực hiện scrollToRowAtIndexPath
phần 3 & 4 sẽ có được offscreen - và do đó tableView bằng cách nào đó vẫn nghĩ rằng họ là offscreen. UITableview ẩn các ô/phần không có màn hình dưới dạng tối ưu hóa. Nếu tôi gọi scrollToRowAtIndexPath
với số dispatch_after
trong 2 giây thì các phần 3 & 4 được hiển thị chính xác.
Vì vậy, tôi nghĩ rằng tôi biết tại sao điều này xảy ra, nhưng tôi không biết cách sửa/ghi đè tối ưu hóa UITableview này. Trên thực tế, nếu tôi triển khai scrollViewDidEndScrollingAnimation
và sau đó thêm điểm ngắt trong chức năng này, ứng dụng sẽ hiển thị các phần 3 & 4 chính xác (đó là cách tôi nhận được ảnh chụp màn hình đầu tiên). Nhưng một khi tiếp tục từ chức năng này, các tế bào biến mất.
Dự án đầy đủ có thể được tải về here
chi tiết thực hiện bổ sung: Phần là phần UITableView hợp pháp. Tôi đã thêm một tapGestureRecognizer mà kích hoạt một cuộc gọi lại đại biểu đến tableview. Dưới đây là toàn bộ phương pháp mở các phần.
- (void)sectionHeaderView:(SectionHeaderView *)sectionHeaderView sectionOpened:(NSInteger)sectionOpened
{
// Open
sectionHeaderView.numRows = DefaultNumRows;
sectionHeaderView.selected = YES;
NSMutableArray *pathsToOpen = [[NSMutableArray alloc] init];
for (int i = 0; i < sectionHeaderView.numRows; i++)
{
NSIndexPath *pathToOpen = [NSIndexPath indexPathForRow:i inSection:sectionOpened];
[pathsToOpen addObject:pathToOpen];
}
// Close
NSMutableArray *pathsToClose = [[NSMutableArray alloc] init];
if (openSectionHeader)
{
for (int i = 0; i < openSectionHeader.numRows; i++)
{
NSIndexPath *pathToClose = [NSIndexPath indexPathForRow:i inSection:openSectionHeader.section];
[pathsToClose addObject:pathToClose];
}
}
// Set Correct Animation if section's already open
UITableViewRowAnimation insertAnimation = UITableViewRowAnimationBottom;
UITableViewRowAnimation deleteAnimation = UITableViewRowAnimationTop;
if (!openSectionHeader || sectionOpened < openSectionHeader.section)
{
insertAnimation = UITableViewRowAnimationTop;
deleteAnimation = UITableViewRowAnimationBottom;
}
openSectionHeader.numRows = 0;
openSectionHeader.selected = NO;
openSectionHeader = sectionHeaderView;
[self.tableView beginUpdates];
[self.tableView insertRowsAtIndexPaths:pathsToOpen withRowAnimation:insertAnimation];
[self.tableView deleteRowsAtIndexPaths:pathsToClose withRowAnimation:deleteAnimation];
[self.tableView endUpdates];
[self.tableView scrollToRowAtIndexPath:[pathsToOpen objectAtIndex:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
Tôi nghĩ rằng bạn nên sử dụng tốt hơn MVC do Apple cung cấp. Tất cả những gì bạn phải làm là thêm/xóa dữ liệu vào nguồn dữ liệu của mình và không chạm vào hàng tableview – divol
Vui lòng thêm một chút dự án của bạn vào câu hỏi, thay vì mong đợi tải xuống - ví dụ: cách bạn tính toán đường dẫn chỉ mục để thêm/xóa và các phần tiêu đề phần "Phần X" của bạn hay chúng chỉ là các ô? Nó sẽ làm cho một câu hỏi độc lập tốt hơn nếu nó không quá phụ thuộc vào tải về dự án của bạn. – jrturton
Tôi nghĩ rằng đoán của bạn là đúng, là tốt. Bạn có thể thử tải lại các hàng tại phương thức ủy nhiệm đã kết thúc cuộn không? – jrturton