EXC_BAD_ACCESS при попытке получить selectedSegmentIndex из 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, это правильный способ настроить обработку события касания.

ОДНАКО, когда я запускаю программу (в симуляторе) и касаюсь сегментов, происходит следующее:

  1. Если это первый сегмент (индекс 0), в консоль записывается 'null'
  2. Если это второй сегмент (индекс 1), программа вылетает с ошибкой EXC_BAD_ACCESS.

Когда я смотрю в окно переменных отладчика, отправитель имеет тип UISegmentedControl, и свойство _selectedSegment кажется правильным (0 или 1).

К чему я неправильно обращаюсь и как настроить функцию делегата для переключения между двумя значениями UISegmentedController?


person Ben Jacobs    schedule 02.07.2012    source источник


Ответы (1)


Ваш NSLog неверен. selectedSegmentIndex возвращает NSUInteger, поэтому вам нужно использовать @"%d" вместо @"%@". %@ предназначен для объектов, поэтому система пытается использовать число как адрес памяти, указывающий на объект, и выдает вам ошибку.

person pgb    schedule 02.07.2012
comment
Всегда простые, которые доставят тебя... Это сделало это. - person Ben Jacobs; 02.07.2012