0

したがって、cellForRowAtIndexPathの外側のセルを変更することは通常は嫌われていますが、これが私が持っているものです。

質問のインデックスとして使用される静的テーブルがあります(1-33)。各行には、質問と詳細開示インジケーターがあります。これらはすべて、ストイボードに手動で入力されます。

各質問と、質問に回答したかどうかなどのいくつかのプロパティをリストしたファイルがあります。
この画面が読み込まれたら(viewDidAppear)、これらの質問のそれぞれが読み込まれたかどうかを確認し、読み込まれた場合は、詳細インジケーターをチェックマークに切り替えます。

これで、最初の5つのセルで機能します。質問に行って戻ってくると、さらに多くのセルがチェックされます(質問に回答されていない場合でも)。cellForRowAtIndexPathの外部でアクセスしているため、これは未定義の動作ですか?

セルにアクセスして変更するために使用しているコードは次のとおりです。

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (question1Answered)
    { 
        UITableViewCell *cell1 = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:3]];
        [cell1 setAccessoryType:UITableViewCellAccessoryCheckmark];
    }
}

繰り返しになりますが、最初の5つの要素に対しては機能し、残りは私が何をしても変更されません。次に、質問に移動して戻ると、選択した状態でさらに表示されます。奇妙な振る舞い...

編集:上記のコードが機能することに気づきましたが、現在画面に表示されているセルのみが更新されます。したがって、下にスクロールして、離れて戻ってくると、表示されているすべてのセルにチェックマークが付きます。表示されていない場合でも、すべてのセルを強制的に更新する方法はありますか?

助けてくれてありがとう...

-デビッド

4

3 に答える 3

0

からセルを更新しないでくださいviewDidAppear

代わりに、viewDidApeearからデータをリロードする必要があります。

-(void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if (question1Answered)
    {             
        //This will call your tableview's delegate for visible cells
        [self.tableView reloadData];
    }
}

また、cellForRowAtIndexPath内で、アクセサリタイプを割り当てるかどうかを決定する必要があります。

于 2012-08-04T04:48:10.290 に答える
0

これは、数日前に答えた別の質問に似ています。stackoverflow.com/a/11770387/1479411を参照してください

デリゲートメソッドを使用します。他のViewControllerから戻った後、セルの内容と[self.tableViewreloadData]を変更するコードをdelegateメソッドに配置します。

于 2012-08-05T08:51:55.727 に答える
0

Uは最初にモデルを更新してから、モデルの状態に応じてUIを更新する必要があります。
たとえば、モデルがQuestionオブジェクトの配列であり、各質問にhasBeenAnsweredブール値がある場合です。
次に、viewDidAppearでuが行う必要があるのは、を呼び出すことだけです[self.tableView reloadData]。これにより、テーブルビューが更新されます。これは、cellForRowAtIndexPath呼び出され、モデルの状態に応じてセルを設定するためです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"CellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(cell == nil) { 
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // configure the cell according to your model state  
    Question *question = [self.questions objectAtIndex:indexPath.row];  

    // check if this question has been answered
    if (question.hasBeenAnswered) {
       // if yes - set a checkmark
       [cell setAccessoryType:UITableViewCellAccessoryCheckmark];  
    }
    else {
       // if not - set to none (or whatever u want)
       [cell setAccessoryType:UITableViewCellAccessoryNone];
    }

    return cell;
}
于 2012-08-05T09:32:56.107 に答える