0

私は簡単なデモを作成していましたUITableView:1つのセルが選択されている場合、セルに目盛りが表示され、最後に選択されたセルのチェックが解除されます。シミュレーターで実行すると、最初に1つのセルを選択すると良いですが、別のセルを選択した場合セル、ログ情報なしでアプリケーションがクラッシュしてしまい、何が起こったのかわかりませんでした。コーディングで行ったことは次のとおりです。

ヘッダ:

#import <UIKit/UIKit.h>   
@interface ViewController2 : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
    NSIndexPath * oldIndexPath;
    NSArray *list;
}
@property(retain,nonatomic)NSIndexPath *oldIndexPath;
@property(strong,nonatomic)NSArray *list;
@end

実装:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];

    if(oldIndexPath == nil){
        cell.accessoryType = UITableViewCellAccessoryCheckmark;

    }else{
        UITableViewCell * oldCell = [tableView cellForRowAtIndexPath:oldIndexPath];
        oldCell.accessoryType = UITableViewCellAccessoryNone;
    }
    oldIndexPath = indexPath;
}

どんな助けでも大歓迎です、ありがとう

4

2 に答える 2

1

常に 経由self.でプロパティにアクセスし、ivar に直接アクセスしないでください。直接割り当てることで、アクセサー メソッドで使用されるメモリ管理をバイパスし、後で値を使用するときに解放されます。

Xcode の現在のバージョンでは、プロパティをバックアップしたり、synthesize を使用したりするために ivar を宣言する必要はありません。これにより、誤って ivar に直接アクセスするのを防ぐことができます。

于 2012-12-31T09:54:18.167 に答える
0

これを試してみてください。うまくいくことを願っています。

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


{

UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];


if(self.oldIndexPath != nil)

{

    UITableViewCell * oldCell = [tableView cellForRowAtIndexPath:self.oldIndexPath];
    oldCell.accessoryType = UITableViewCellAccessoryNone;
}

cell.accessoryType = UITableViewCellAccessoryCheckmark;



self.oldIndexPath = indexPath;

}

于 2012-12-31T10:00:27.187 に答える