这是我的旧问题Link
之前我问了一个问题,但我把答案放在我的代码中它可以编译而没有错误
但是当我点击开关时,程序崩溃
我只想点击开关,而不是返回我点击的哪一行
这是我的代码
首先我创建一个LightTableViewController.h/.m
比我创建LightCell0.h/.m
LightCell0.h
中的
@interface LightCell0 : UITableViewCell {
UILabel *lightLocation;
UIImageView *lightImageView;
UISwitch *lightSwitch;
}
@property(nonatomic,retain) UILabel *lightLocation;
@property(nonatomic,retain) UIImageView *lightImageView;
@property(nonatomic,retain) UISwitch *lightSwitch;
- (void)switchlightswitch:(id)sender;
我需要每个单元格都是一个图像,Textlabel,切换到里面
在LightCell.m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
lightLocation = [[UILabel alloc]init];
lightLocation.textAlignment = UITextAlignmentLeft;
lightLocation.font = [UIFont boldSystemFontOfSize:20];
lightLocation.backgroundColor = [UIColor blackColor];
lightLocation.textColor =[UIColor whiteColor];
lightImageView = [[UIImageView alloc]init];
lightSwitch = [[UISwitch alloc]init];
[self.contentView addSubview:lightLocation];
[self.contentView addSubview:lightImageView];
[self.contentView addSubview:lightSwitch];
[lightSwitch addTarget:self action:@selector(switchlightswitch:) forControlEvents:UIControlEventValueChanged];
// Initialization code
}
return self;
}
- (void)switchlightswitch:(id)sender {
if (lightSwitch.on){
lightImageView.image = [UIImage imageNamed:@"lightOn.png"];
}
else {
lightImageView.image = [UIImage imageNamed:@"lightOff.png"];
} }
- (void)layoutSubviews {
[super layoutSubviews];
CGRect contentRect = self.contentView.bounds;
CGFloat boundsX = contentRect.origin.x;
CGRect frame;
frame = CGRectMake(boundsX+10 ,0, 44, 44);
lightImageView.frame = frame;
frame = CGRectMake(boundsX+60 ,3, 150, 44);
lightLocation.frame = frame;
frame = CGRectMake(boundsX+220, 10,0,0);
lightSwitch.frame = frame ;
}
到目前为止,程序可以在我改变开关状态时响应,它也会改变图像。
但如果我把这段代码放入,我可以编译,而不是碰到任何开关
[lightSwitch addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged]
;
并给出一个空白
- (void)switchToggled:(id)sender {
UISwitch *theSwitch = (UISwitch *)sender;
UITableViewCell *cell = (UITableViewCell *)theSwitch.superview;
UITableView *tableView = (UITableView *)cell.superview;
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
if(theSwitch.on) {
NSLog(@"You Switch On the NodeID:%i ",indexPath.row);
}
else {
NSLog(@"You Switch Off the NodeID:%i ",indexPath.row);
}
}
崩溃邮件是“Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[LightCell0 indexPathForCell:]: unrecognized selector sent to instance
”
有谁知道我的代码发生了什么?
答案 0 :(得分:1)
从错误消息中,我怀疑你的演员是错的:
UITableViewCell *cell = (UITableViewCell *)theSwitch.superview;
UITableView *tableView = (UITableView *)cell.superview;
你确定theSwitch的superview是一个UITableViewCell,单元格的超级视图是UITableView。崩溃告诉您,您尊重的tableView对象是LightCell0对象
答案 1 :(得分:0)
要获取交换机的状态,您使用的是“yourSwitch.on”,我认为这是不正确的。
把它改为[yourSwitch isOn]
并测试你的应用。
我在你的代码中看到2个语句,用于检查交换机的状态。改变它们并尝试。
答案 2 :(得分:0)
我找到了答案! theSwitch.superview实际上返回UITableViewCell中的contentView。 所以你应该改为:
UITableViewCell *cell = (UITableViewCell *)theSwitch.superview.superview;