以编程方式将开关添加到scrollview会引发异常

时间:2012-01-17 19:20:03

标签: iphone objective-c ios xcode

我正在使用故事板并将滚动视图窗口拖到视图上。在我的代码中,我以编程方式创建一个以某种方式未正确初始化的switch对象。交换机正确显示在视图上,但每当我单击开关时,都会抛出异常

“无法识别的选择器发送到实例0x6a786f0'”

我还尝试将On / Off文本编辑为Yes / No,并且访问该开关也会抛出相同的异常。显然,我在创建开关和设置正确的代表或其他任何事情时都遗漏了一些东西。

创建交换机的代码是..

        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:]。当通过尝试调整文本来调用错误时,“原因”是原因:' - [UIImageView setText:]

对我所缺少的任何帮助都会很棒。

由于

1 个答案:

答案 0 :(得分:2)

例外是正确的,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 
    }
}