Виберіть рядок після завантаження 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.