2011-09-04 45 views
5

Tôi đang cố gắng để có được hang của UITableViews và tất cả mọi thứ đi kèm với nó. Tại thời điểm này tôi có đoạn mã sau:Ứng dụng TableView bị chấm dứt do 'NSInternalInconsistencyException'

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 


    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 

    [cell.textLabel setText:[NSString stringWithFormat:@"I am cell %d", indexPath.row]]; 

    return cell; 
} 

- (IBAction)killItem { 
    NSIndexPath *indexToDelete = [NSIndexPath indexPathForRow:2 inSection:0]; 
    [tbl deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexToDelete] withRowAnimation:UITableViewRowAnimationRight]; 
} 

Và tôi nhận được lỗi sau khi khởi sự "killItem" chức năng:

Chấm dứt ứng dụng do ngoại lệ còn tự do 'NSInternalInconsistencyException', lý do: 'không hợp lệ cập nhật: số hàng không hợp lệ trong phần 0. Số hàng có trong phần hiện có sau khi cập nhật (10) phải bằng số hàng có trong phần đó trước bản cập nhật (10), cộng hoặc trừ số các hàng được chèn hoặc xóa khỏi phần đó (0 đã chèn, 1 đã bị xóa). '

Cách tôi hiểu bảng tableViews về cơ bản có một đại biểu và nguồn dữ liệu nơi nguồn dữ liệu, trong số những thứ khác, xác định số lượng hàng sẽ nằm trong tableView. Thông qua một số tìm kiếm ở đây tại stackoverflow Tôi đã tìm thấy rằng lỗi này được gây ra khi "nguồn dữ liệu không khớp với thực tế", khi nó tìm kiếm các hàng không tồn tại, mà tôi đã xóa.

Tôi có thể đã nhận được điều này sai nhưng đó là những gì tôi nghĩ là làm điều đó. Vì vậy, câu hỏi của tôi là, làm thế nào để tôi có được những điều này để phù hợp để tôi có thể tránh được lỗi này?

Để tham khảo, tôi đã nhìn vào bài viết sau đây mà không hiểu những gì tôi cần phải làm:

Error : Number of Rows In Section in UITableView in iPhone SDK

Slide UITableViewCell

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 1 beyond bounds [0 .. 0]'

Thêm [tbl reloadData], [tbl beginUpdate] ... [tbl endUpdate] trong killItem chức năng, doesen't dường như giúp đỡ vấn đề của tôi eighter.

Cảm ơn bạn trước, Tobias Tovedal

Trả lời

12

Nó khá dễ dàng, vấn đề nằm ở đây:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 10; 
} 

Các mô hình đại biểu được sử dụng bởi táo, có nghĩa là bạn là người duy nhất chịu trách nhiệm về quản lý nội dung của UITableView thông qua các đại biểu của mình, có nghĩa là, nếu bạn xóa một hàng, bạn cũng chịu trách nhiệm xóa dữ liệu khỏi mô hình dữ liệu. Vì vậy, sau khi xóa một hàng, nó sẽ có ý nghĩa rằng số lượng hàng trong phần sẽ giảm xuống còn "9", nhưng chức năng của bạn luôn luôn trở về 10, và do đó ném ngoại lệ.

Thông thường, khi sử dụng một bảng, và các nội dung sẽ thay đổi, một NSMutableArray là khá phổ biến, bạn làm điều gì đó như thế này:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [arrayWithStuff count]; 
} 

Và sau đó, xóa một đối tượng (removeObjectAtIndex:) từ mảng sẽ tự động cập nhật số hàng.

(Edit: trả lời vào khoảng thời gian tương tự như Mike Hay, hãy thử làm theo lời khuyên của ông quá tôi bỏ qua bắt đầu/kết thúc Update, vì có vẻ như bạn đã đọc về nó!)

+0

Cảm ơn bạn rất nhiều, đã giải quyết được vấn đề của tôi một cách độc đáo! : D –

12

Tobias, những gì bạn cần làm khi xóa hàng là

// tell the table view you're going to make an update 
[tableView beginUpdates]; 

// update the data object that is supplying data for this table 
// (the object used by tableView:numberOfRowsInSection:) 
[dataArray removeObjectAtIndex:indexPath.row]; 

// tell the table view to delete the row 
[tableView deleteRowsAtIndexPaths:indexPath 
      withRowAnimation:UITableViewRowAnimationRight]; 

// tell the table view that you're done 
[tableView endUpdates]; 


Khi bạn gọi endUpdate số trở về từ tableView:numberOfRowsInSection: phải giống như số tại beginUpdate trừ đi số hàng bị xóa.

+0

Cảm ơn bạn là tốt Mike! :) –

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