2010-08-29 29 views
9

Chế độ xem bảng của tôi hiển thị danh sách người dùng. Tôi đang gặp sự cố khi làm mới chế độ xem bảng của mình sau khi thêm người dùng. Tôi đã thử kết hợp mã và sự kiện khác nhau và bây giờ ứng dụng đang gặp sự cố trong cuộc gọi endUpdates. Ứng dụng được mô hình hóa sau ứng dụng công thức, vì vậy người dùng nhấp vào nút thêm và sau đó cửa sổ phương thức xuất hiện yêu cầu tên người dùng. Sau đó, nó đi vào màn hình chỉnh sửa, và sau đó trở lại danh sách người dùng. Tại thời điểm đó, người dùng mới không hiển thị. Nhưng nếu tôi điều hướng trở lại màn hình chính, và sau đó quay lại màn hình người dùng, người dùng sẽ xuất hiện.Ứng dụng iPhone gặp lỗi trên [self.tableView endUpdates]

Dưới đây là một số mã của tôi:

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    sectionInsertCount = 0; 
    [self.tableView beginUpdates]; 
} 
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 
    [self.tableView endUpdates]; 

} 

    - (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type { 
switch(type) { 

    case NSFetchedResultsChangeInsert: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount++; 
      } 

    break; 
    case NSFetchedResultsChangeDelete: 
      if (!((sectionIndex == 0) && ([self.tableView numberOfSections] == 1))) { 
       [self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade]; 
       sectionInsertCount--; 
      } 

    break; 
     case NSFetchedResultsChangeMove: 
      break; 
     case NSFetchedResultsChangeUpdate: 
      break; 
     default: 
      break; 
} 
} 

    - (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
switch(type) { 
    case NSFetchedResultsChangeInsert: 
      [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
    case NSFetchedResultsChangeDelete: 
    [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    break; 
     case NSFetchedResultsChangeUpdate: { 
      [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
     } 
    case NSFetchedResultsChangeMove: 
      if (newIndexPath != nil) { 

       NSUInteger tableSectionCount = [self.tableView numberOfSections]; 
       NSUInteger frcSectionCount = [[controller sections] count]; 
       if (frcSectionCount != tableSectionCount + sectionInsertCount) { 
        [self.tableView insertSections:[NSIndexSet indexSetWithIndex:[newIndexPath section]] withRowAnimation:UITableViewRowAnimationNone]; 
        sectionInsertCount++; 
       } 


       [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
       [self.tableView insertRowsAtIndexPaths: [NSArray arrayWithObject:newIndexPath] 
            withRowAnimation: UITableViewRowAnimationRight]; 

    runEndUpdates = NO; 

      } 
      else { 
       [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:[indexPath section]] withRowAnimation:UITableViewRowAnimationFade]; 
      } 
    break; 
     default: 
    break; 
} 
} 

Tôi gần như tại một điểm phá vỡ với điều này. CoreData là phần bực bội nhất trong phát triển ứng dụng. Tôi có nên chuyển sang SQL Lite không? Hoặc tôi vẫn sẽ có những vấn đề tương tự?

Cảm ơn!

Trả lời

2

Hôm nay tôi gặp vấn đề tương tự.

Sự cố nằm trong mã nguồn của tôi - một trong các hàm UITableViewDataSource đã sử dụng đối tượng không hợp lệ (không phải đối tượng CoreData, mảng đơn giản mà tôi quên giữ), điều này gây ra sự cố. Thật không may, điều này không rõ ràng từ ngăn xếp cuộc gọi, không có thông báo nào được cung cấp trong bảng điều khiển.

Vì vậy, lý do có thể là do bạn triển khai giao thức UITableViewDataSource.

+0

Nhưng nếu bạn sử dụng fetchedResultsController (giống như tác giả đã làm) - nó rất khó để thực hiện một sai lầm ở đây :) Số phần: return [self.fetchedResultsController.sections count]; Số hàngInSection: trả về [self.fetchedResultsController.sections [section] numberOfObjects]; – Miroslav

-3

Cố gắng gọi [self.tableview reloaddata] bên trong bộ điều khiểnDidChangeContent.

+6

sẽ giết toàn bộ mục đích của việc thay đổi hàng hoạt ảnh. – samvermette

+0

"Bạn không nên gọi reloadData trong nhóm, nếu bạn gọi phương thức này trong nhóm, bạn sẽ cần phải tự mình thực hiện bất kỳ hoạt ảnh nào". - từ tài liệu của Apple: https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/beginUpdates – Fabio

5

Theo kinh nghiệm của tôi, nó phải có một số hàng hoặc phần được chèn hoặc xóa giữa beginUpdated và endUpdated. Nếu không có hàng hoặc phần nào được chèn vào hoặc bị xóa giữa beginUpdated và endUpdated, nó sẽ bị lỗi.

Và nếu số phần và số hàng không đúng, nó cũng sẽ bị lỗi. Vì vậy, nó cần mã hóa rất cẩn thận.

+0

Điều này khắc phục được sự cố tôi đã có. Tôi đã lọc các hàng với UISearchBar và NSFetchedResultsController. Người dùng sẽ chọn hàng kích hoạt một sự kiện lưu trong didSelectRowAtIndexPath. Tạo cờ và cài đặt thành NO, đã dừng UITableView beginUpdates và endUpdates đang được gọi và giải quyết vấn đề. Cảm ơn Toro – RobCroll

2

Tôi đã gặp sự cố ở cùng một vị trí, nhưng vì một lý do khác. Tôi cũng sẽ thấy hành vi kỳ lạ này khi cuộn chế độ xem bảng sẽ làm chậm quá trình thu thập thông tin và về cơ bản trở nên không phản hồi. Lý do đằng sau việc này kết thúc là loại gọn gàng và thú vị vì vậy tôi nghĩ rằng tôi muốn chia sẻ nó.

Chế độ xem bảng của tôi có một loạt sự kiện được sắp xếp theo ngày. Các sự kiện được truy vấn từ một API web 50 tại một thời điểm. Mỗi khi một truy vấn mới được thực hiện, bản cập nhật kết quả được tìm nạp và các ô mới sẽ hoạt ảnh. Đầu tiên tôi nhận thấy có rất nhiều thay đổi lạ khi hàng mới được thêm vào, nhưng nó dường như giống như một cái gì đó để tối ưu hóa sau này.

Sự kiện trong ứng dụng có thể được lưu và chế độ xem bảng có cách lọc giữa tất cả các sự kiện và sự kiện đã lưu. Một lần tôi chỉ cần chạm vào bộ lọc để chuyển đổi qua lại giữa tất cả các sự kiện và sự kiện đã lưu và tôi nhận thấy rằng trong một ngày cụ thể khi tôi chuyển về chế độ xem tất cả sự kiện, chúng sẽ được sắp xếp lại.

Ồ, tôi cũng cần một bộ mô tả cho thời gian bắt đầu. Đó là một cái gì đó sẽ làm cho các ứng dụng đẹp hơn để sử dụng.

OH DUH! Tôi đặt cược đây là lý do tại sao nó bị rơi quá! Vì mọi bản cập nhật cơ bản đều làm cho mọi hàng hiện có được di chuyển đến một vị trí mới, cộng thêm các hàng bổ sung, tôi phải vừa mới nhấn một số lỗi trong trình điều khiển xem bảng. Bây giờ các vấn đề di chuyển đã biến mất và tai nạn cũng biến mất.

Bài học kinh nghiệm: Đảm bảo bộ điều khiển kết quả được tìm nạp của bạn có đủ bộ mô tả sắp xếp để kết quả là yếu tố quyết định khi tải lại chế độ xem.

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