2012-06-04 5 views
0

이 문제가 거의 발생하지만 테이블을 검색 한 후에 입력 한 상세 뷰에서 managedObjectContext를 업데이트하면 NSFetchedResultsChangeUpdate가 넘어지게됩니다.검색된 테이블 뷰에서 NSFetchedResultsChangeUpdate가 충돌하면

핵심 데이터 세트에서 생성 된 tableview가 있습니다. 이 테이블에서 상세보기를 입력하고 아무런 문제없이 변경할 수 있습니다. 또한 테이블을 검색하고 아무런 문제없이 시간을 최대한 변경할 수 있습니다. 그러나 어떤 개체에서는 "핵심 데이터 변경 처리 중에 예외가 발생했습니다"라는 메시지가 나타납니다.

NSFetchedResultsChangeUpdate까지 추적했습니다. 다음 코드를 사용하고 있습니다.

case NSFetchedResultsChangeUpdate: 
if (searchTermForSegue) 
{ 
NSLog(@"index info:%@.....",theIndexPath); 
NSLog(@"crashing at the next line"); 
[self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath]; 
break; 
} else { 
[self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath]; } 
break; 

테이블을 검색하지 않으면 else 메서드가 실행되고 100 % 시간이 작동합니다. 테이블을 검색 할 때 if (searchTermForSegue)를 실행하면 대부분의 경우 작동하지만 항상 그런 것은 아닙니다. 나는 theIndexPath를 기록하고 다음을 발견했다 :

그것이 작동하면 theIndexPath는 indexPat 객체를 올바르게보고하고 실패 할 때 잘못된 theIndexPath가 호출되었다. 예를 들어, I 3 부 2 개 제 항목 1 초에서, 제 1 행있는 tableView 좁아 검색을 수행하는 경우, I는 다음 nslog 얻을 :

On first object: index info:<NSIndexPath 0xb0634d0> 2 indexes [0, 0]..... 
on second object: index info:<NSIndexPath 0xb063e70> 2 indexes [0, 1]..... 
on third object: index info:<NSIndexPath 0xb042880> 2 indexes [1, 0]..... 
but on the last object: index info:<NSIndexPath 0x9665790> 2 indexes [2, 17]..... 

가 호출되어야한다 [2,0을 ]

이 개체를 삭제하거나 새 개체를 추가하는 것이 아니라 단순히 개체를 업데이트하는 것입니다.

의견을 보내 주시면 감사하겠습니다.

답변

-1

좋아, 문제를 해결하는 것으로 보이는 해킹을 알았지 만 문제를 해결하는 가장 좋은 방법처럼 보이지 않습니다! 이견있는 사람?

NSFetchedResultsChangeUpdate가 기본 테이블에서 호출되었을 때 한 번만 호출되었지만 검색/필터링 된 테이블에서 호출되었을 때 두 번 호출되었습니다 (겉으로보기에는 100 %입니다 - 이것이 새로 고치는 것 같아요. 검색된 테이블과 검색되지 않은 테이블 모두?). 또한 두 번째 호출에 올바른 정보가있는 동안 첫 번째 호출에는 항상 잘못된 indexPath가있는 것처럼 보였습니다. 잘못된 indexPath가 범위를 벗어나면 첫 번째 호출에서 앱이 다운됩니다. 에,

int    changeCall; 

다음 :

내 "수정"는 tableview.h 파일의 인터페이스에 추가 다음

을 수행하여 검색 테이블에서 NSFetchedResultsChangeUpdate 경우 첫 번째 통화를 무시했다 에는 loadView에서 tableview.m 파일 :

changeCall = 0; 

그때 나는이에 NSFetchedResultsChangeUpdate 업데이트 :

기본적으로 changeCall int를 사용하여 검색된 테이블 업데이트에서 첫 번째 호출을 건너 뛰지 만 두 번째 호출을 사용하여 실제로 내용을 업데이트합니다. 이것은이 문제를 해결할 수있는 최선의 방법은 아니지만 bandaid가 효과가있는 것으로 보입니다. 나는 누군가가 더 좋은 대답을하면 분명히 감사 할 것입니다.

또한 첫 번째 NSFetchedResultsChangeUpdate를 건너 뛰면 검색되지 않은 테이블이 새 값을 반영하도록 업데이트되지 않습니다. 나는 searchDisplayControllerWillEndSearch 방법에 테이블을 다시로드 호출을 추가하여이 문제를 해결했습니다

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller 
{ 
    [self setSearchTermForSegue:nil]; 
    [self.tableView reloadData]; 
} 

감사합니다!

관련 문제