2010-06-28 52 views
12

Vì vậy, tôi đang cập nhật một chế độ xem bảng bằng cách chèn/xóa/tải lại hàng nếu cần, nhưng, vì tôi không tự tin 100% rằng tableview sẽ luôn cập nhật chính xác, có cách nào không an toàn từ hàng loạt cập nhật không đúng ?UITableView: Khôi phục từ NSInternalInconsistencyException sau khi cập nhật xấu?

Ngay bây giờ, tôi có điều này:

// Try to animate the updates. If something goes wrong, just reloadData. 
    @try { 
     [tableView beginUpdates]; 
     [tableView deleteRowsAtIndexPaths:deleteArray withRowAnimation:UITableViewRowAnimationMiddle]; 
     [tableView reloadRowsAtIndexPaths:reloadArray withRowAnimation:UITableViewRowAnimationNone]; 
     [tableView insertRowsAtIndexPaths:insertArray withRowAnimation:UITableViewRowAnimationMiddle]; 
     [tableView endUpdates]; 
    } 
    @catch (NSException * e) { 
     if([[e name] isEqualToString:NSInternalInconsistencyException]){  
      [tableView reloadData]; 
      NSLog(@"animation failed, just reloading data"); 
     } 
     else { 
      @throw e; 
     } 
    } 

Tuy nhiên, một khi nó chạm ngoại lệ đó, reloadData dường như không làm việc. Có cách nào khác về cơ bản để thiết lập lại UITableView vào một trạng thái làm việc?

Trả lời

3

Lý tưởng hơn là bạn nên sao lưu bảng bằng một mảng được đảm bảo thực hiện những gì mà bảng mong đợi. UIKit hy vọng các trường hợp ngoại lệ sẽ gây tử vong (điều này phù hợp với triết lý của Apple là ngoại lệ cho biết lỗi lập trình viên.)

+2

Vâng, điều đó sẽ cực kỳ lý tưởng. Tôi không có nghĩa là để âm thanh snide, nhưng lý tưởng là tất cả mọi thứ sẽ làm việc ra tốt đẹp và không có gì sẽ đi sai. Thật không may, điều đó hiếm khi xảy ra. Và trong mã sản xuất, tôi sẽ thay vì thất bại một cách an toàn thay vì đâm ứng dụng vào mặt người dùng. –

+3

@David tốt, nếu bạn hoàn toàn thiết lập khôi phục. Tôi sẽ bắt ngoại lệ, sau đó tạo lại chế độ xem bảng. Biết rằng điều này gần như chắc chắn sẽ rò rỉ một số bộ nhớ và có thể để lại những thứ khác ở các trạng thái không mong muốn. – cobbal

Các vấn đề liên quan