2012-01-11 15 views
0

このコードは、アプリケーションをクラッシュさせます。私は辞書をループしていて、すべてが正常にログアウトします。私はforループではなく、そうでない場合には-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の数と一致します。

しかし、1回のサイクルで良いです。次のサイクルが発生すると、if...loopには[projectsTable reloadData]を同じif...loopに含めない限り、アプリが再びクラッシュします。

reloadData方法はうまく動作しますが、あなたは、単にdeleteRowsAtIndexPathsまたはinsertRowsAtIndexPathsメソッドを使用する行を削除、またはオブジェクトを追加または削除することによって、あなたのテーブルに行を追加し、その優れているかの間。オーバーヘッドが少なくなり、アプリの作業が楽になり、スムーズかつ高速になります。

[(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i];の直後にコードを作成するには、deleteRowsAtIndexPathsを呼び出してtableViewから対応するオブジェクトを削除します。

また、beginUpdatesendUpdatesを使用することもできます。詳細については、http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

を参照してください。

+0

溶液を見いだした。問題は、currentValue == finishValueでロードされたオブジェクトがすぐに配列から削除され、穴ができてしまうという問題でした。最初から5つのオブジェクトがあったとしますが、forループ中に1つは削除されますが、ループはまだ5つあると考えているのでオーバーループします:) 申し訳ありません、私の間違いです! – Hjalmar

関連する問題