0

特にTableViewセルにチェックマークが必要です。

だから私はコードを使用しました:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

newRow = [indexPath row];
oldRow = [lastIndexPath row];

if (newRow != oldRow) {
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;

    UITableViewCell *oldCell = [tableView cellForRowAtIndexPath: lastIndexPath]; 
    oldCell.accessoryType = UITableViewCellAccessoryNone;

    lastIndexPath = indexPath; 
}
else{
    UITableViewCell *newCell = [tableView cellForRowAtIndexPath:indexPath];
    newCell.accessoryType = UITableViewCellAccessoryCheckmark;
    lastIndexPath = indexPath;
}}

iPhoneシミュレーターで問題なく動作します。しかし、iPhoneデバイスでテストしていると、アプリケーションがクラッシュします。

これに対する解決策..?

前もって感謝します。

4

2 に答える 2

2

クラッシュの最も可能性の高い原因は ivar にありますlastIndexPath。値を保持せずにこれに格納しているため、いつでも解放される可能性があります。lastIndexPath(retain手動参照カウントstrong用、自動参照カウント用)という名前のプロパティを定義してみてください。次に、self.lastIndexPath = indexPathまたはを使用できます[self setLastIndexPath:indexPath]

また、このように強制的にセルの内容を変更するのもよくありません。選択したインデックスを保存してから、テーブル データをリロードすることをお勧めします。最大限の効率を得るには、変更されたセルのみを更新します。cellForRowAtIndexPath:メソッドでチェックマークのオンとオフを切り替えます。

于 2012-04-25T04:35:43.273 に答える
0

「cellForRowAtIndexPath」メソッドに次のコードを記述するだけです。

[[cell imageView] setImage:[UIImage imageNamed:@"tickmarkBlue.png"]];
[[cell imageView] setHidden:YES]; 

if(<your condition here>)
{
      [[cell imageView] setHidden:NO];
}
于 2012-04-25T04:32:19.423 に答える