2010-09-15 2 views
1

Вот мой старый вопрос LinkОшибка программы при нажатии переключателя?

задать вопрос раньше, но я положил ответ в моем коде может компилятор без ошибок

Но когда я нажимаю выключатель, программа аварию

I просто хочу нажать на переключатель, чем возвращение в какой строке я нажимаю

Вот мой код

Сначала я создаю 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; 
} 

- (недействительными) switchlightswitch: (id) отправитель {

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»

Кто-нибудь знает, что происходит с моим кодом?

ответ

1

Из сообщения об ошибке, я подозреваю, что ваш бросок не так:

UITableViewCell *cell = (UITableViewCell *)theSwitch.superview; 
UITableView *tableView = (UITableView *)cell.superview; 

Вы уверены, что SuperView из является Больше, чем друг UITableViewCell и супер вид клетки является UITableView. Крушение скажет вам, что объект tableView, который вы считаете объектом LightCell0

+0

Я не уверен ....... Потому что я просто ссылку на ответ и сразу скопировать в свой код .... –

+0

Vodkhang правильно, ваша логика/дизайн в какой-то момент является неправильным. «Супервизор» «супервизора» коммутатора - это ваша ячейка, а не таблица, как вы ожидаете, – Liam

+0

, это не мой ответ ... просто кто-то сказал мне, что это может быть работа ... поэтому я копирую его ответ. –

0

Для получения статуса переключателя вы используете «yourSwitch.on», что, по моему мнению, неверно. Chang это [yourSwitch isOn] и протестируйте ваше приложение. Я вижу в вашем коде 2 оператора, в которых вы проверяете состояние переключателя. Измените их и попробуйте.

+0

, но все еще не знаю, чтобы получить, какой переключатель я нажимаю? –

+0

yourSwitch.on верен, это свойство – vodkhang

+0

Почему бы не дать коммутатору тег и создайте новый NSIndexPath на основе тега: NSIndexPath * indexPath = [NSIndexPath indexPathForRow: [sender tag] inSection: 0 ]; – CW0007007

0

Я нашел ответ! theSwitch.superview фактически возвращает contentView внутри UITableViewCell. Таким образом, вы должны изменить, чтобы:

UITableViewCell *cell = (UITableViewCell *)theSwitch.superview.superview;