1

たくさんのタスクを含む 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);
}
4

1 に答える 1