Виберіть рядок після завантаження UIPickerView


77

У мене є програма баз даних iPhone, яка завантажує a UIPickerViewз даними з таблиці. Я хочу встановити для вибраного рядка певний рядок із даних іншої таблиці.

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

Куди я телефоную selectRow?

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


Просто вставте код @jab у його відповідь після завантаження даних і надання делегата. Ось що мені вдалося!
Анураг Шарма

Відповіді:


140

Зателефонуйте йому після отримання даних. Я не знаю, куди ви завантажуєте дані, тому це лише макет того, що має працювати. Якщо це не має сенсу, дайте мені знати, куди ви завантажуєте дані, щоб я міг їх скласти в голові :)

-(void)viewDidLoad
{
    // load data from sql
    // self.someDataArray = DATAFROMSQL
    [picker reloadAllComponents];
    [picker selectRow:0 inComponent:0 animated:YES];
}

Дякую, я отримую дані у viewDidLoad, як і ваш макет. Мені довелося створити метод для перерахування списку, щоб знайти індекс збігів, а потім встановити засіб вибору. Я думав, що, можливо, мені не вистачає зворотного виклику, який міг бути використаний після завантаження засобу вибору та перед поверненням до циклу подій.
Стів Гібсон,

це працює, але чому це спричиняє стільки відставання при завантаженні подання? (у ситуації на панелі вкладок)
CularBytes

@Jab ваша відповідь правильна перед selectRowдзвінком не забувайте дзвонити reloadAllComponents!!!!
Хатторі Хандзо

44

Існує поширена проблема, коли потрібно вибрати елемент (за замовчуванням) UIPickerView, коли UIPickerView спочатку відображається. Проблема пов’язана з послідовністю подій. З прочитання попередніх повідомлень, здається, що [pickerView selectRow: n] зазвичай викликається в події контролерів подання ViewDidLoad. Однак дані UiPickerView завантажуються лише після події ViewDidLoad, що означає, що будь-який код вибору в ViewDidLoad не матиме ефекту. Щоб виправити помилку, розмістіть код вибору у ViewDidAppear;

- (void) viewDidAppear:(BOOL)animated {
[m_pickerView selectRow:nSelectedItem inComponent:0 animated:YES]; }

7

Розмістіть це де б ви не ініціалізували те, UIViewщо містить ваш UIPickerViewяк підпрогляд:

[myPickerView selectRow:rowWithTedsName inComponent:columnWithNames animated:NO];

4

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



0

Якщо ви хочете, щоб вибраний рядок був постійно виділений, використовуйте це

myPickerView.subviews[0].subviews[0].subviews[2].backgroundColor = myPickerView.tintColor;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.