2009-06-16 27 views
13

Sự cố này đã khiến tôi bận rộn trong những giờ qua. Tôi có hai phần với một hàng trong mỗi phần. Khi tôi xóa hàng trong một trong các phần hơn là nó ném một ngoại lệ cho biết đây là bản cập nhật không hợp lệ (số hàng/phần trước và sau khi cập nhật không giống nhau). Điều này là dễ hiểu khi tôi xóa hàng cuối cùng của một phần và do đó tôi xóa phần đó. Câu hỏi đặt ra là làm thế nào để tránh ngoại lệ.Làm cách nào để xóa hàng cuối cùng của một phần?

Mọi thứ đều ổn với nguồn dữ liệu của tôi. Tôi đã kiểm tra và kiểm tra lại (tin tôi).

Vì vậy, như tiêu đề của trạng thái chuỗi, làm thế nào để bạn xóa hàng cuối cùng của một phần mà không nhận được ngoại lệ?

Cảm ơn,

Bart

+0

“title của thread” Đây là một câu hỏi và câu trả lời tại chỗ, không phải là diễn đàn. Bạn có nghĩa là tiêu đề của câu hỏi. –

Trả lời

26

Khi bạn xóa một hàng, và hàng này là cuối cùng một trong những phần của nó, bạn cũng cần phải xóa phần. Về cơ bản, bạn cần phải theo dõi cả indexPath mà bạn muốn xóa, được liên kết với các hàng và các chỉ mục liên quan đến các phần cần được xóa vì chúng không còn chứa các hàng nữa. Bạn có thể thực hiện như sau:

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSet]; 

Mỗi lần bạn xóa một đối tượng khỏi mảng mô hình liên quan đến một phần cụ thể của bảngXem trường hợp thêm một chỉ mục đại diện cho phần để chỉ số:

[array removeObjectAtIndex:indexPath.row]; 
if(![array count]) 
    [indexes addIndex: indexPath.section]; 

Xác định tất cả các indexPaths liên quan đến các hàng bị xóa, sau đó cập nhật tableView như sau:

[tableView beginUpdates]; 
[tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade]; 
[tableView deleteSections:indexes withRowAnimation:UITableViewRowAnimationFade]; 
[tableView endUpdates]; 

này đã làm việc cho tôi và o có người tôi đề xuất phương pháp tiếp cận.

+0

Tùy chọn này hoạt động mặc dù khi bạn xóa phần cuối cùng một ngoại lệ khác được ném (nhưng tôi sẽ tìm cách giải quyết vấn đề này). Tôi cảm thấy khó tin rằng đây là cách duy nhất. Có vẻ như unApple/unelegant. Nó không chỉ hoạt động ;-). Cảm ơn cho đầu vào của bạn, mặc dù. –

+2

Để thêm vào điều này, khi tôi xóa hàng cuối cùng trong một phần, tôi chỉ gọi deleteSections: withRowAnimation :. Tôi không gọi deleteRowsAtIndexPaths: withRowAnimation :. Các hình ảnh động trông giống nhau, và nó không ném bất kỳ trường hợp ngoại lệ. – Alex

+0

Bạn xử lý việc xóa hàng cuối cùng của phần cuối cùng như thế nào? –

1

Có lẽ điều này có thể làm việc cho bạn:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 

    NSString *key = [self.keys objectAtIndex:section]; 
    NSMutableArray *rowsInSection = [self.dict objectForKey:key]; 
    [rowsInSection removeObjectAtIndex:row]; 

    NSUInteger rowsInSectionCount = [rowsInSection count]; 

    if (rowsInSectionCount > 0) { 
     // If we still have rows in this section just delete the row 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
    else { 
     // There are no more rows in this section 
     [self.dict removeObjectForKey:key]; 
     [self.keys removeObjectAtIndex:section]; 

     NSUInteger sectionCount = [self.keys count]; 

     if (sectionCount > 0) { 
      // If we still have 1 or more sections left just delete this section 
      [tableView deleteSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
     else { 
      // If there are no more rows and sections left just delete the last row 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tableView reloadData]; 
     } 
    } 
} 

Hy vọng điều này là những gì bạn đang tìm kiếm.

1

Cái này nên làm như lừa:

// Either delete some rows within a section (leaving at least one) or the entire section. 
    if ([indexPath section] < 0) { 
     [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } else if ([indexPath section] == 0) { 
     [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
1

Đối Swift 2, sau khi loại bỏ các dữ liệu trong mô hình của bạn:

tableView.beginUpdates()      

    let indexSet = NSMutableIndexSet() 
    indexSet.addIndex(indexPath.section) 
    tableView.deleteSections(indexSet, withRowAnimation: UITableViewRowAnimation.Fade) 

    tableView.endUpdates() 
Các vấn đề liên quan