2013-08-23 29 views
5

Trong ứng dụng của tôi, tôi lại TableView tôi ([tablView reloadData];) sau hàng xóa từ TableView sau đó canEditRowAtIndexPath Phương pháp nhất luôn gọi cho (dể qua) tổng số hàng.Tại phương thức canEditRowAtIndexPath, tải lạiData của UITableView không hoạt động đúng?

Ví dụ:

Nếu tôi có Rows trên TableView của tôi, sau đó tôi xóa hàng từ tableView. Sau khi xóa, tôi reload TableView tôi ([tablView reloadData]) nhưng canEditRowAtIndexPath Phương pháp gọi 5 lần thay vì 4 lần ??

Vì vậy, tôi luôn nhận được sau Lỗi:

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

Tôi cũng đã cố gắng để tải lại bảng sau khi một số chậm trễ (sử dụng NSTimer) nhưng nó cũng không làm việc cho tôi.

tôi đặt một số mã ở đây:

tôi áp dụng canEditRowAtIndexPath trên hàng cụ thể mà @"status" isEqualToString:@"directory" ví dụ như,

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%d", self.listOfSounds.count); 
    // Return NO if you do not want the specified item to be editable. 
    if([[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"status"] isEqualToString:@"directory"]) 
     return YES; 
    else 
     return NO; 
} 

Mã của hàng xóa:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB 
     [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array 
     [self updateListofSoundsFile]; /// Custom method 
    } 
} 

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return NO; // i also tried to return YES; 
} 

đây updateListofSoundsFile là của tôi mã phương thức tùy chỉnh là:

-(void)updateListofSoundsFile 
{ 
    if(self.listOfSounds.count > 0) 
     [self.listOfSounds removeAllObjects]; 

    self.listOfSounds = [self.sql_ getAllDataFromAudioTable]; // get all record from DB 
    NSLog(@"%d",self.listOfSounds.count); 

    [self.tblView reloadData]; 
} 

Vui lòng đưa ra bất kỳ đề xuất nào, Làm cách nào để giải quyết vấn đề này?
Cảm ơn :)

+0

Đăng phương thức 'numberOfRowsInSection' của bạn. Câu hỏi - Trong phương thức 'commitEditingStyle' của bạn, tại sao bạn gọi' updateListOfSoundsFile'? Bạn đã cập nhật 'listOfSounds' bằng cách xóa một đối tượng. Sau khi loại bỏ đối tượng khỏi mảng, chỉ cần gọi 'deleteRowsAtIndexPaths' để xóa một hàng khỏi bảng.Ngoài ra, hãy xác minh rằng lệnh gọi của bạn tới 'deleteSoundFileAudioTableWhereMainID' thực sự đang xóa một hàng khỏi cơ sở dữ liệu. – rmaddy

Trả lời

5

bạn cần phải loại bỏ nguyên từ tableview cũng befor mục remove từ mảng và tải lại dữ liệu sử dụng dòng này becouse loại bỏ mục từ mảng nhưng không tableview.

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB 

     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array 

     [self updateListofSoundsFile]; /// Custom method 
    } 
} 
+4

Đây không phải là giải pháp. 1 - bạn nên luôn xóa dữ liệu khỏi nguồn dữ liệu trước khi cập nhật bảng. 2 - Nếu bạn định gọi 'reloadData', không có lý do nào để gọi' deleteRowsAtIndexPath: '. Giải pháp này có thể hoạt động nhưng nó đang ẩn một số vấn đề khác. – rmaddy

+2

sau đó xin vui lòng hướng dẫn chúng tôi giải pháp thích hợp là gì, xin vui lòng đặt câu trả lời với giải pháp thích hợp. cảm ơn của –

+2

@ rmaddy-sir, nếu bạn có giải pháp tốt nhất khác sau đó xin vui lòng hướng dẫn chúng tôi, để nâng cao kiến ​​thức. cảm ơn –

0
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB 
     [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array 
     [self updateListofSoundsFile]; /// Custom method 
    } 
    [self.tblView reloadData]; 
} 
+0

Vui lòng giải thích cách giải quyết vấn đề này? Phương thức 'updateListofSoundsFile' đã gọi' reloadData'. – rmaddy

+0

bạn đặt updateListofSoundsFile ra ngoài nếu điều kiện ... – hitesh

2

Tôi chạy vào vấn đề này giống nhau. Vấn đề là tôi đã xóa đối tượng của ô nhưng khi tôi sử dụng phương thức reloadData của tableView, phương thức canEditRowAtIndexPath của tôi không được gọi là có thể chỉnh sửa các ô mà tôi không muốn chỉnh sửa. Sửa chữa thực sự không gọi phương thức deleteRowsAtIndexPaths, nhưng phương pháp [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];.

Về cơ bản đây là những gì đã xảy ra:

Khi tôi gọi reloadData: Dữ liệu thô đã không bị loại bỏ khỏi tableView như Nitin nói. Vì vậy đây không phải là giải pháp.

Khi tôi gọi deleteRowsAtIndexPaths: iOS phát hiện sự khác biệt giữa dữ liệu cơ bản và số lượng ô (vì tôi đã xóa đối tượng cơ bản). Kết quả là một vụ tai nạn mà cũng không phải là giải pháp (rõ ràng).

Bây giờ để khắc phục sự cố!

Khi tôi gọi reloadRowsAtIndexPaths: Điều này khiến bảngView chỉ cần tải lại ô đơn lẻ đó và nó đã loại bỏ dữ liệu thô. Đây là giải pháp.

Thay vì loại bỏ các đối tượng dataSource, sau đó cố gắng để loại bỏ các tế bào mà chủ yếu được hỗ trợ bởi nothing vào thời điểm này (gây ra một vụ tai nạn), chỉ cần loại bỏ các đối tượng dataSource, sau đó tải lại rằng indexPath của tableView

đây là định dạng chung của phương pháp này:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     [myDataSourceArray removeObjectAtIndex:indexPath.row]; 
     [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; 
    } 
} 

đây là lần đầu tiên tôi chạy vào vấn đề này với các dữ liệu thô còn sót lại mà không được lấy ra bằng cách đơn giản gọi phương thức reloadData. Đây chắc chắn là giải pháp thanh lịch nhất mà tôi đã thấy cho đến nay.

Mã hóa hạnh phúc! Tôi hi vọng cái này giúp được.

0

Khi nói đến tôi, tôi đã phân tích như sau:

Theo nhận xét của rmaddy trên Nitin Gohel's câu trả lời:

  1. Bạn nên luôn luôn loại bỏ các dữ liệu từ các nguồn dữ liệu trước khi cập nhật bàn.

    Tôi cảm thấy đây là cách lý tưởng.

  2. Nếu bạn định gọi reloadData, không có lý do gì để gọi đầu tiên là deleteRowsAtIndexPath.

    Điều này cũng có vẻ chính xác.

tôi đã phân tích sự mơ hồ, nếu tôi viết reloadData crashishing của nó nhưng một khi tôi viết deleteRowsAtIndexPath nó làm việc tốt.

Hope ai đó sẽ nhấn mạnh về vấn đề này cho nguyên nhân của nó, vv

0

của removeObjectAtIndex: indexPath 'mất một thời gian và tôi nghi ngờ bạn [self.tblView reloadData] đang được gọi là sớm. Tôi đã thử một số mẫu mã và tìm thấy thành công với [UITableView beginUpdates][UITableView endUpdates] bạn cũng có thể tránh sụp đổ nếu bạn đặt một sự chậm trễ chút trước khi nạp lại hoặc các hàng xóa đã không thử nó dù

[tableTable beginUpdates]; 
[tableArray removeObjectAtIndex:indexPath.row]; 
[tableTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
[tableTable endUpdates]; 
Các vấn đề liên quan