0

我做了一个简单的演示UITableView:当一个单元格被选中时,在单元格中显示一个勾号,最后一个选中的单元格将被取消选中,当在模拟器中运行时,第一次选择一个单元格时很好,而如果选择另一个单元格,应用程序将在没有任何日志信息的情况下被粉碎,我不知道发生了什么。这是我在编码中所做的:

标题:

#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 中,您不需要声明 ivars 来支持属性或使用 synthesize。这可以防止您不小心直接访问 ivars。

于 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 回答