Выбрать строку после загрузки UIPickerView - PullRequest
73 голосов
/ 01 мая 2009

У меня есть приложение для базы данных iPhone, которое загружает UIPickerView с данными из таблицы. Я хочу установить выбранную строку для определенной строки из данных в другой таблице.

Например: допустим, у меня есть UIPickerView, который загружен с X числом имен друзей пользователей iPhone (количество имен является переменным; это может быть 1 или 1000, и все они вводятся в базу Пользователь). Пользователь iPhone установил, что его лучший друг - TED . Я хочу, чтобы при отображении UIPickerView было установлено значение TED .

Куда мне звонить selectRow?

Я пытался в viewDidAppear, но он никогда не вызывался, в titleForRow, что вызывало все виды странного поведения. viewDidLoad и viewWillAppear не может быть и речи, потому что я пока не знаю, что находится в источнике данных для сборщика.

Ответы [ 6 ]

136 голосов
/ 02 мая 2009

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

-(void)viewDidLoad
{
    // load data from sql
    // self.someDataArray = DATAFROMSQL
    [picker reloadAllComponents];
    [picker selectRow:0 inComponent:0 animated:YES];
}
42 голосов
/ 22 октября 2010

Существует общая проблема, когда необходимо выбрать элемент (по умолчанию) UIPickerView при первоначальном отображении UIPickerView. Проблема связана с последовательностью событий. Из прочтения предыдущих сообщений кажется, что [pickerView selectRow: n] обычно вызывается в событии ViewDidLoad контроллеров представления. Однако данные UiPickerView загружаются только после события ViewDidLoad, что означает, что любой код выбора в ViewDidLoad не будет иметь никакого эффекта. Чтобы исправить это, поместите код выбора в ViewDidAppear;

- (void) viewDidAppear:(BOOL)animated {
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; }
7 голосов
/ 02 мая 2009

Поместите это там, где вы инициализируете UIView, который содержит ваш UIPickerView как подпредставление:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];
4 голосов
/ 25 апреля 2011

Я только что обнаружил, что на 4.3 SDK поведение загрузки компонентов различно для iPhone и iPad. На iPhone я собирался вызвать selectRow: сразу после инициализации представления до или после добавления в иерархию подпредставлений. Однако на iPad вызов selectRow не дал результатов. Я завелся с помощью executeSelector: withObject: afterDelay: вызов для ожидания 0,1 секунды, прежде чем запустить selectRow: inComponent: animated :. Это имело предсказуемые результаты на iPhone и iPad.

3 голосов
/ 04 июля 2017

Для Swift это просто:

self.picker?.selectRow(0, inComponent: 0, animated: true)
0 голосов
/ 26 марта 2017

Если вы хотите, чтобы выбранная строка была постоянно выделена, используйте эту

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor;
...