1

さて、私は何日もこれにいて、私が間違っていることを理解することができないようです。

私が欲しいのは、行が選択されたときに更新するコアデータです。私はそれを理解しましたが、それからテーブルビューを更新して変更を表示したいと思います。それが私が問題を抱えているところです。走る:

    [NSFetchedResultsController deleteCacheWithName:@"Root"];
    fetchedResultsController = nil;
    NSError *error = nil;
    if(![[self fetchedResultsController] performFetch:&error]){

    }
    [[self tabVe] reloadData];

データを更新した後、テーブルビューは更新されません。ビューを変更して戻ってきますが、スタックしています。スクロールしてさらに行を選択することはできますが、テーブルが更新されることはありません。セグメント化されたコントローラーがあり、データを希望どおりに変更するとうまく機能しますが、テーブルがスタックすると言う理由は、行を選択した後、セグメント化されたコントローラーがテーブルの内容を変更しないためです。行が選択される前に。

編集モードではこれを行っていません。選択されたときに値を更新するだけです。これが私のコードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return [[self.fetchedResultsController sections] count];
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo name];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        [self.tabVe deselectRowAtIndexPath:indexPath animated:YES];
        if(cyc == 1){
            UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
            if(cell.accessoryType == UITableViewCellAccessoryCheckmark){
                cell.accessoryType = UITableViewCellAccessoryNone;
            }else {
                cell.accessoryType = UITableViewCellAccessoryCheckmark;
                Items *anItem = [self.fetchedResultsController objectAtIndexPath:indexPath];
                anItem.need = @"0";
                NSError *error = nil;
                if(![managedObjectContext save:&error]){

                }
                [NSFetchedResultsController deleteCacheWithName:@"Root"];
                fetchedResultsController = nil;
                NSError *error = nil;
                if(![[self fetchedResultsController] performFetch:&error]){

                }
                [[self tabVe] reloadData];
            }
        }
    }

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = [[managedObject valueForKey:@"name"] description];
    cell.detailTextLabel.text = [[managedObject valueForKey:@"notes"] description];
    if([[managedObject valueForKey:@"need"] description] == @"0"){
        cell.accessoryType = UITableViewCellAccessoryNone;
    }else if([[managedObject valueForKey:@"need"] description] == @"1"){
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
}

私は誰かが私がこれを理解するのを手伝ってくれることを望んでいます。cycは、セグメント化されたコントローラーの現在の位置を示すNSIntegerです。現在、cycが1に等しい場合にのみアイテムを更新しています。

編集:

まですべてがスムーズに実行されます

if(![managedObjectContext save:&error]){

}

実行されます。その後、テーブルが動かなくなったようです。

4

1 に答える 1

3

推測するだけですが、2つのことが頭に浮かびます。

  1. didSelectRowAtIndexPath:私の経験では、コードを削減してみてください。にを設定fetchedResultsControllernil、遅延読み込みでフェッチを処理するだけで十分です。もう1つのアイデアは、キャッシュをまったく使用しないことです。それは試してみる価値があり、パフォーマンスに影響を与えなければ確かに合理的です。

  2. 2つの文字列を。と比較していることに気づきました==isEqualToString:この比較にはこの方法を使用する必要があると思います。descriptionまた、文字列に加えてメソッドが必要な理由もわかりません。andescriptionNSStringはまったく同じ文字列です。これも単純化してみてください。

また、コードからは、変数cycが何であり、どこから来ているのかが明確ではありません。より人間が理解できる変数名を選択することをお勧めします。

于 2011-08-24T09:17:49.543 に答える