たくさんのタスクを含む To Do リスト アプリがあります。各タスクには UITableViewCell があります。各テーブル ビュー セルがタップされると、その行のインデックス パスのプロパティでタスクを使用してビュー コントローラーが作成されます。これらのView ControllerはすべてNSDictionaryに格納されています。これは、私が今言ったことのコード表現です:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detailVC;
if (![self.detailViewsDictionary.allKeys containsObject:indexPath]){
detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
[self.detailViewsDictionary setObject:detailVC forKey:indexPath];
detailVC.context = self.managedObjectContext;
}else{
detailVC = self.detailViewsDictionary[indexPath];
}
Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
detailVC.testTask = task;
[[self navigationController] pushViewController:detailVC animated:YES];
NSLog(@"%@", self.detailViewsDictionary);
}
したがって、一意のView Controllerを作成し、特定のキーで保存するこの方法は、ほとんどの場合機能します。ビューコントローラーを削除または移動すると、問題が発生します。
下にスクロールすると(デキュー)、セルがリサイクルされるという印象を受けました。これは、各セルを番号識別子でマークすると、同じ識別子に対して複数のセルが生成されることを意味します。
また、各View ControllerをindexPathキーで保存した場合、キーが2つのView Controllerに設定されていないことを確認するにはどうすればよいですか? 例えば。4 つのセルがあるとします。これは、4 つのビュー コントローラーを意味します。セル 3 を削除します。セル 4 はセル 3 のスポットに移動します。スポット 4 に移動する新しいセルを作成します。これで、同じ indexPath キーを持つ 2 つのコントローラーができました。どうやってこれを回避しますか?? 既に移動されたタスクが間違ったビュー コントローラー/セルにプロパティをロードしているため、現在アプリが台無しになっています。
以前、「テーブルの内容を「隠す」NSMutableArray を維持する」という問題を解決するために、これが提案されました。タグの使用も提案されました。ただし、これらを実装する方法がわかりません。
編集: ---ランダムな文字列--- tasks.m 内
-(NSString *)uniqueIdentifierString{
static NSString *alphabet = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZY0123456789";
NSMutableString *s = [NSMutableString stringWithCapacity:20];
for (NSUInteger i = 0U; i < 20; i++) {
u_int32_t r = arc4random() % [alphabet length];
unichar c = [alphabet characterAtIndex:r];
[s appendFormat:@"%C", c];
}
return s;
}
tableviewcontroller.m 内
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
DetailViewController *detailVC;
Tasks *task = [[self fetchedResultsController] objectAtIndexPath:indexPath];
if (![self.detailViewsDictionary.allKeys containsObject:task.uniqueIdentifierString]){
detailVC = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];
[self.detailViewsDictionary setObject:detailVC forKey:task.uniqueIdentifierString];
detailVC.context = self.managedObjectContext;
}else{
detailVC = self.detailViewsDictionary[task.uniqueIdentifierString];
}
detailVC.testTask = task;
[[self navigationController] pushViewController:detailVC animated:YES];
NSLog(@"%@", detailVC);
NSLog(@"%@", task.uniqueIdentifierString);
}