1

ストーリーボードに配線された UITableViewController サブクラスがあります。選択すると、データの要素のエディターがプッシュされます。このエディタには、新しいエントリ用の「完了」ボタンと、既存のエントリ用の「削除」ボタンがあります。それらは次のように配線されています。

- (void)doneButtonClicked:(id)sender {
    [self setEditing:NO animated:NO];
    [self.navigationController popViewControllerAnimated:YES];
    [self.delegate taskDefinitionEditor:self didCreate:self.taskDefinition];
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (buttonIndex) {

        case 1:
            [self.delegate taskDefinitionEditor:self didDelete:self.taskDefinition];
            [self.navigationController popViewControllerAnimated:YES];
            break;

        default:
            break;
    }
}

UIAlertView は確認ダイアログです。
ご覧のとおり、エディターはデリゲートを呼び出して、新しいアイテムまたは削除されたアイテムについて通知します。これは UITableViewController サブクラスになります。それが私の問題の原因であるかどうかを調べるために、デリゲートとナビゲーションコントローラーの呼び出しの異なる順序を使用しました。そうではありません。

最後に、ここに私の問題があります。
このような挿入/削除の後に画面がテーブルに戻ると、UITableView はしばらくの間、またはスクロールされるまでセルを選択しません。

viewDidAppear でテーブルビューを手動でスクロールしようとしましたが、役に立ちませんでした。また、reloadData、refreshControl の突っ込み、userInteraction、allowsSelection、allowsSelectionDuringEdit の無効化と有効化も試しました。
今日、Web で他のソリューションを探すのに数時間費やしましたが、うまくいくものは見つかりませんでした。

完全を期すために、デリゲート メソッドを次に示します。

- (void)taskDefinitionEditor:(id)sender didCreate:(TaskDefinitionEntity *)taskDefinition {
    //remote call
    [self.dataProvider createTaskDefinition:taskDefinition success:^(TaskDefinitionEntity *taskDefinition){
        NSMutableArray *mutableDefinitions = self.taskDefinitions.mutableCopy;
        [mutableDefinitions addObject:taskDefinition];
        self.taskDefinitions = mutableDefinitions;

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:mutableDefinitions.count-1 inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
        });
    } failure:^(NSError *error){
        NSLog(@"error creating task-definition:\n%@", error);
        [self requestFailed:error showAlert:YES];
    }];
}

- (void)taskDefinitionEditor:(id)sender didDelete:(TaskDefinitionEntity *)taskDefinition {
    //remote call
    [self.dataProvider deleteTaskDefinition:taskDefinition success:^(void){
        NSMutableArray *mutableDefinitions = self.taskDefinitions.mutableCopy;
        NSInteger index = [self.taskDefinitions indexOfObject:taskDefinition];

        [mutableDefinitions removeObjectAtIndex:index];

        self.taskDefinitions = mutableDefinitions;

        dispatch_async(dispatch_get_main_queue(), ^{
            [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:0]] withRowAnimation:UITableViewRowAnimationAutomatic];
        });
    } failure:^(NSError *error){
        NSLog(@"error deleting task-definition:\n%@", error);
        [self requestFailed:error showAlert:YES];
    }];
}

したがって、基本的には、サーバーへのリモート呼び出しを実行し、更新されたオブジェクトを受け取り、テーブルビューとデータソースに挿入/削除するだけです。

4

2 に答える 2

1

問題は、バックグラウンドで実行されていたキャッシュの更新でした。コントローラーに更新されたデータを通知する通知が含まれており、これにより tableView がリロードされます。

このリロードはバックグラウンド スレッドでトリガーされたため、UI は応答しませんでした。で修正しましたperformSelectorOnMainThread

コントローラーのデータモデルプロパティを監視するようにデバッガーを設定することで、それを発見しました。

@MySpecialPurpose、時間を無駄にして申し訳ありません。提案をありがとう。

于 2013-02-08T09:57:22.223 に答える
0

insertrows:/ deleterows:メソッド呼び出しをディスパッチキューからプルしてみましたか?

于 2013-02-05T16:32:43.273 に答える