Выбор элемента управления UISegmentedControl приводит к SIGABRT - PullRequest
0 голосов
/ 21 сентября 2011

Цель состоит в том, чтобы иметь MKMapView, который переключается с mapType, используя UISegmentedControl.

Однако, нажимая один из сегментированных элементов управления, я получаю это в своем выводе:

2011-09-21 18: 36: 39.127 ShutterBug [2022: ec03] - [__NSCFData indexOfObject:]: нераспознанный селектор отправлен в экземпляр 0x5c90700 2011-09-21 18: 36: 39.130 ShutterBug [2022: ec03] * Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: '- [__NSCFData indexOfObject:]: нераспознанный селектор, отправленный экземпляру 0x5c90700'

Вот соответствующая часть моего кода, получениеSIGABRT в первой строке changeMapType:

static NSArray *mapTypeChoices = nil;
#define MAP_STREET @"Street"
#define MAP_SATELLITE @"Satellite"
#define MAP_HYBRID @"Hybrid"

- (UISegmentedControl *)mapTypeSegmentedControl
{
    if (!mapTypeChoices) mapTypeChoices = [NSArray arrayWithObjects:MAP_STREET, MAP_SATELLITE, MAP_HYBRID, nil];

    UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithItems:mapTypeChoices];
    segmentedControl.segmentedControlStyle = UISegmentedControlStyleBar;
    [segmentedControl addTarget:self action:@selector(changeMapType:) forControlEvents:UIControlEventValueChanged];

    switch (self.mapView.mapType) {
        case MKMapTypeStandard: segmentedControl.selectedSegmentIndex = [mapTypeChoices indexOfObject:MAP_STREET]; break;
        case MKMapTypeSatellite: segmentedControl.selectedSegmentIndex = [mapTypeChoices indexOfObject:MAP_SATELLITE]; break;
        case MKMapTypeHybrid: segmentedControl.selectedSegmentIndex = [mapTypeChoices indexOfObject:MAP_HYBRID]; break;
    }

    return [segmentedControl autorelease];
}

- (void)changeMapType:(UISegmentedControl *)segmentedControl
{
    if (segmentedControl.selectedSegmentIndex == [mapTypeChoices indexOfObject:MAP_STREET]) {
        self.mapView.mapType = MKMapTypeStandard;
    } else if (segmentedControl.selectedSegmentIndex == [mapTypeChoices indexOfObject:MAP_SATELLITE]) {
        self.mapView.mapType = MKMapTypeSatellite;
    } else if (segmentedControl.selectedSegmentIndex == [mapTypeChoices indexOfObject:MAP_HYBRID]) {
        self.mapView.mapType = MKMapTypeHybrid;
    }
}

EDIT: отладчик показывает мне, что changeMapType: вызывается дважды при нажатии UISegmentedController только один раз ..

Ответы [ 2 ]

0 голосов
/ 21 сентября 2011

Ваш статический массив, mapTypeChoices, выпускается автоматически.Это не свойство класса, поэтому оно не будет сохранено автоматически (при условии, что вы определили атрибут свойства retain).Не используйте автоматически выпущенный инициализатор для NSArray.Вместо этого используйте -initWithObject:.

0 голосов
/ 21 сентября 2011

mapTypeChoices автоматически высвобождается при создании в mapTypeSegmentedControl.Тем временем память была перераспределена на что-то другое (NSData, по-видимому), поэтому она вылетает при попытке запросить indexOfObject.

Предполагая, что mapTypeChoices является переменной экземпляра класса, просто retain после ее создания, и все готово.(Не забудьте release на dealloc, хотя!

...