尝试获取UISegmentedControl的selectedSegmentIndex时的EXC_BAD_ACCESS

时间:2012-07-02 18:01:00

标签: iphone ios uisegmentedcontrol

我是以编程方式将UISegmentedControl添加到我的UINavigationBar中,如下所示

UISegmentedControl *toggleSwitch = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects: @"Bar", @"Scatter", nil]];
toggleSwitch.segmentedControlStyle = UISegmentedControlStyleBar;
[toggleSwitch addTarget:self action:@selector(toggleSwitched:) forControlEvents:UIControlEventValueChanged];

UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithCustomView:toggleSwitch];
self.navigationItem.rightBarButtonItem = buttonItem;
[toggleSwitch release];
[buttonItem release];

然后我有一个方法,toggleSwitched来处理事件:

-(void) toggleSwitched:(id) sender {
    if([sender isKindOfClass:[UISegmentedControl class]]) {
        NSLog(@"%@",((UISegmentedControl*)sender).selectedSegmentIndex );
    }
}

在我阅读Apple Documentation时,这是为触摸事件设置事件处理的正确方法。

但是,当我运行程序(在模拟器中)并点击片段时,会发生以下情况:

  1. 如果它是第一个段(索引0),则将“null”记录到控制台
  2. 如果是第二段(索引1),程序将崩溃并显示EXC_BAD_ACCESS
  3. 当我查看调试器的变量窗口时,sender的类型为UISegmentedControl,而_selectedSegment属性似乎是正确的(0或1)。

    我不正确地访问了什么以及如何设置我的委托功能以在UISegmentedController的两个值之间切换?

1 个答案:

答案 0 :(得分:2)

您的NSLog错了。 selectedSegmentIndex会返回NSUInteger,因此您需要使用@"%d"代替@"%@"%@用于对象,因此系统会尝试将该数字用作指向对象的内存地址,并为您生成错误。