我正在使用情节串连板,并已将滚动视图窗口拖到视图上。在我的代码中,我正在以编程方式创建一个开关对象,但不知何故,该对象没有正确初始化。开关正确显示在视图上,但每当我单击开关时,就会抛出一个异常,显示
"无法识别的选择器发送到实例0x6a786f0'"
我还试图将"开/关"文本编辑为"是/否",访问开关也会引发同样的异常。很明显,我在创建开关和设置正确的代理或其他方面错过了一些东西。
我创建交换机的代码是..
UISwitch *switchControl = [[UISwitch alloc] initWithFrame:CGRectMake(x, y, 60, 20)];
[switchControl addTarget:inputsView action:@selector(actionSwitch:) forControlEvents:UIControlEventTouchUpInside];
[switchControl setBackgroundColor:[UIColor clearColor]];
//[(UILabel *)[[[[[[switchControl subviews] lastObject] subviews]
// objectAtIndex:1] subviews] objectAtIndex:0] setText:@"Yes"];
//[(UILabel *)[[[[[[switchControl subviews] lastObject] subviews]
// objectAtIndex:1] subviews] objectAtIndex:1] setText:@"No"];
[inputsView addSubview:switchControl];
inputsView是我在.h文件中创建的UIScrollView的名称。
我应该注意,当单击开关时调用异常时,在错误中,"原因"是原因:"-[UIScrollView actionSwitch:]。当通过尝试调整文本来调用错误时,"原因"是原因:'-[UIMImageView setText:]
对我所缺少的任何帮助都将是非常好的。
感谢
异常是正确的,UIScrolView
没有方法actionSwitch:
。addTarget:
中的目标参数是要接收selector:
参数的对象。
如果您发布的代码在具有actionSwitch:
方法的类中,那么您将使用self作为目标,如下所示:
[switchControl addTarget:self action:@selector(actionSwitch:) forControlEvents:UIControlEventTouchUpInside];
作为旁注。对于UISwitch
,你通常希望你的方法被调用为UIControlEventValueChanged
,这样,如果用户只是触摸开关,但没有"切换"它,你的方法就不会被调用。
编辑以回应:"我刚刚尝试将UISwitch更改为'self',但错误仍然发生。我还没有创建actionSwitch方法。"
是的,您的应用程序仍然会崩溃,因为无论您作为目标传入什么,都必须实现作为选择器传入的选择器/方法。
视图控制器是实现这种方法的理想场所。这个事件目标的一个非常标准的实现看起来像:
-(void)actionSwitch:(UISwitch *)theSwitch{
if (theSwitch.isOn){
// Switch was switched on respond accordingly
}
else {
// Switch was switched off respond accordingly
}
}