Значение по умолчанию для выбора iphone

Есть ли способ установить значение по умолчанию для сборщика? Я сохраняю последнюю выбранную строку из всех сборщиков и хочу, чтобы сборщики загружали эти сохраненные строки при запуске. На данный момент я нашел этот код:

[settingsPagePicker selectRow:3 inComponent:0 animated:YES];

Это работает, но только когда пользователь нажимает на средство выбора. Мне нужно, чтобы он работал при первой загрузке приложения. Если я поставлю этот код в viewDidLoad, приложение вылетит. Кто-нибудь знает, где правильно разместить это в моем коде, чтобы заставить его работать?

Спасибо за уделенное время!


person Jeff    schedule 26.10.2009    source источник


Ответы (2)


Вы проверили свой источник данных для settingsPagePicker перед вызовом -selectRow:inComponent:animated, чтобы убедиться, что данные доступны по этому индексу (3 в вашем примере кода)?

Как вы загружаете свои данные для своего источника данных? Вы можете сначала инициализировать свой источник данных в viewDidLoad, а затем вызвать selectRow, как только вы узнаете, что данные доступны.

ОБНОВЛЕНИЕ: Вот как должен выглядеть ваш код или что-то в этом роде:

- (void)viewDidLoad
{
    [super viewDidLoad];
    pickerDataSource = [[NSMutableArray alloc] init];
    [pickerDataSource addObject:@"Item 01"];
    [pickerDataSource addObject:@"Item 02"];
    [pickerDataSource addObject:@"Item 03"];
    [pickerDataSource addObject:@"Item 04"];

    // Might want to move this to -viewWillAppear:animated
    [settingsPagePicker selectRow:3 inComponent:0 animated:YES];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
    if (pickerView == settingsPagePicker)
    {
        return [pickerDataSource objectAtIndex:row];
    }
    return @"";
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{
    if (pickerView == settingsPagePicker)
    {
        return [pickerDataSource count];
    }
    return 0;
}

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)thePickerView
{
    return 1;
}
person Matt Long    schedule 26.10.2009
comment
Я получаю: Завершение приложения из-за необработанного исключения «NSRangeException», причина: «*** -[NSCFArray objectAtIndex:]: индекс (0) за пределами (0)». Сначала мне нужно инициализировать источник данных, но как я могу инициализировать источник данных без нажатия с помощью средства выбора? - person Jeff; 26.10.2009
comment
Похоже, ваш источник данных - NSArray. Ваша ошибка означает, что вы пытаетесь получить доступ к строке в несуществующем (пока) источнике данных. Как вы сейчас распределяете NSArray? В каком случае? Нажатие средства выбора не должно быть требованием для инициализации NSArray. Просто инициализируйте его в -viewDidLoad. Затем, когда -pickerView:titleForRow:forComponent должен возвращать любой объект, находящийся в этом индексе (строке) в вашем NSArray. - person Matt Long; 26.10.2009
comment
Мой NSArray инициализируется в viewDidLoad. Если я поставлю точку останова в массиве, приложение остановится на этом. мне кажется я что-то не то.. - person Jeff; 26.10.2009
comment
Можете ли вы опубликовать свой код viewDidLoad в исходном вопросе в качестве обновления? Также было бы полезно, если бы вы разместили свой код делегата сборщика. - person Matt Long; 26.10.2009
comment
Теперь это работает!!! Это было что-то очень маленькое и глупое. Я не могу отблагодарить вас за вашу помощь. - person Jeff; 27.10.2009

Вот несколько методов из моего класса.

- (void)viewDidLoad {
   [super viewDidLoad];
   currentNumbersOfComponents = 1;
   //[picker selectRow:2 inComponent:0 animated:NO];
}
- (void) viewDidAppear:(BOOL)animated{
   [super viewDidAppear:animated];
   [picker selectRow:2 inComponent:0 animated:YES];
}

#pragma mark picker view data source methods

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{
    return currentNumbersOfComponents;
}

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
    return 5;
}

picker.dataSource является самостоятельным

person Morion    schedule 26.10.2009
comment
У меня не было метода для viewDidAppear, поэтому я сделал его и поместил туда код, и приложение вылетает прямо на странице settingsPagePicke. - (void) viewDidAppear: (BOOL) анимированный { [settingsPagePicker selectRow: 3 inComponent: 0 анимированный: YES]; [НастройкиPageNaturalGasPicker reloadAllComponents]; } - person Jeff; 26.10.2009
comment
Вам не нужно перезагружать AllComponents, чтобы увидеть изменения после выбора. И проверьте, имеет ли ваш компонент с индексом 0 минимум 4 строки, чтобы разрешить выбор строки с индексом 3. - person Morion; 26.10.2009
comment
Я получаю: Завершение приложения из-за необработанного исключения «NSRangeException», причина: «*** -[NSCFArray objectAtIndex:]: индекс (0) за пределами (0)». Сначала мне нужно инициализировать источник данных, но как я могу инициализировать источник данных без нажатия с помощью средства выбора? - person Jeff; 26.10.2009
comment
Это очень странно, потому что ваш сборщик должен быть полностью инициализирован после появления представления. Проверьте, чтобы методы источника данных вашего средства выбора вызывались до viewDidAppear. И один вопрос: ваше приложение работает без установки строки в сборщике? - person Morion; 26.10.2009
comment
Я просто пишу пример, и он отлично работает. Можешь выложить свой класс? - person Morion; 26.10.2009
comment
Нет, я не могу публиковать занятия (вся эта конфиденциальность... Мой босс настоящий параноик). как я могу инициализировать источник данных без нажатия с помощью средства выбора? - person Jeff; 26.10.2009
comment
Хм. Я немного запутался и, возможно, просто не могу понять вас правильно. Если у вас есть UIPicker в качестве подвида вашего представления, он вызовет методы источника данных до того, как ваше представление появится. Я только что попытался разместить метод selectRow как в viewDidLoad, так и в viewDidAppear, и все в порядке. Я могу опубликовать свой код, если хотите. - person Morion; 26.10.2009
comment
лол, я тоже запутался. Конечно, не повредит опубликовать ваш код. Спасибо. - person Jeff; 26.10.2009
comment
Спасибо Мориону за помощь. Ваш код по большей части похож на мой код. Я посмотрю на это глубже и дам вам знать, где проблема. - person Jeff; 26.10.2009
comment
Теперь это работает!!! Это было что-то очень маленькое и глупое. Я не могу отблагодарить вас за вашу помощь. - person Jeff; 27.10.2009