2012-01-11 11 views
0

이 코드는 응용 프로그램을 중단시킵니다. 나는 사전을 통해 반복 중이며 모든 것이 잘 기록됩니다. 내가 루프하지만 그렇지 않으면 -1을 쓸 때 그것은 당신이 tableView와 wokring한다고 가정ReloadTable 응용 프로그램이 충돌합니다.

-(void)updateProjectTimes { 
for(int i = 0; i < [projectsTable numberOfRowsInSection:0]-1; i++) { 
    NSString *currentValue = [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] objectForKey:@"timepassed"]; 
    NSString *finishValue = [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] objectForKey:@"timeleft"]; 
    if([currentValue intValue] < [finishValue intValue]) { 
     [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] setObject:[NSString stringWithFormat:@"%d", ([currentValue intValue] + 1)] forKey:@"timepassed"]; 
    } else { 
     [(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i]; 
     if([[projects objectForKey:@"activeProjects"] count] == 0) { 
      [projectTimer invalidate]; 
      projectTimer = nil; 
     } 
    } 
    //[projectsTable reloadData]; works if i put it here! 
} 
[projectsTable reloadData]; //<- But not here!! :(
} 
+0

무엇 당신의 실수인가요? – Emil

+0

충돌 로그를 게시하십시오. 코드에서 알 수 없습니다. [편집 된 코멘트는 처음에 '-1'에 대한 언급을 알지 못했습니다. 코드에서 주석으로 더 명확해질 것입니다. – XJones

답변

1

, 작동합니다. 분명히 당신은 tableView의 데이터 소스를 수정하고 있습니다. 데이터 소스에서 개체를 제거하면 tableView도 조정해야합니다. 의미는 reloadData으로 전화하거나 [tableView deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation]으로 전화하십시오.

-1을 입력하면 앱이 충돌하지 않는 이유는 [currentValue intValue] < [finishValue intValue] 조건과 일치하는 항목에만 있기 때문일 수 있습니다. 따라서 [projectsTable numberOfRowsInSection:0]-1을 통과 한 경우 해당 개체를 제거한 후, numberOfRowsInSection은 projectsTable의 수와 일치합니다.

하지만 한 번만 사용해도 좋습니다. if...loop에서 다음 사이클이 발생하면 [projectsTable reloadData]을 동일한 if...loop에 포함시키지 않으면 앱이 다시 충돌합니다.

단순히 행을 제거하거나 더 나은 deleteRowsAtIndexPaths 또는 insertRowsAtIndexPaths 방법을 사용하여, 추가 또는 개체를 제거하여 테이블에 행을 추가하는 경우 reloadData 방법은 잘 작동하지만,하지만. 오버 헤드가 적어지고 앱이 원활 해지고 더 빨라질 것입니다.

[(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i]; 바로 뒤에 코드 작업을 수행하려면 테이블 뷰에서 해당 개체를 제거하고 deleteRowsAtIndexPaths을 호출하십시오.

또는 beginUpdatesendUpdates을 사용할 수도 있습니다. 전체 참조 자료는 http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

을 참조하십시오.

+0

해결책을 찾았습니다. 문제는 currentValue == finishValue로로드 된 객체가 배열에서 즉시 제거되어 구멍이 생성된다는 것입니다. 처음부터 5 개의 오브젝트가 있다고 가정 해 봅시다. 하나는 for 루프 동안 제거되지만 루프는 여전히 우리가 5 개가 있다고 생각하므로 overloops입니다. 죄송합니다, 실수! – Hjalmar

관련 문제