Як отримати вибране значення з UIPickerView


76

Я знаю, що з UIDatePicker ви можете використовувати щось на зразок:

NSDate *myDate = picker.date;

Але я використовую UIPickerView на мій погляд. Як я можу подібним чином отримати вибране значення? Або мені потрібно налаштувати метод didSelectRow для цього?

Оновлення: Цей код працює для засобу вибору з 1 компонентом:

NSInteger row;
NSString *weightSelected;

row = [repPicker selectedRowInComponent:0];
weightSelected = [pickerArray objectAtIndex:row];

Я втомив цей код для мого засобу вибору з 2 компонентами, але він замерзає:

NSInteger row1, row2;
NSString *weightSelected1;
NSString *weightSelected2;

row1 = [repPicker selectedRowInComponent:0];
row2 = [repPicker selectedRowInComponent:1];
weightSelected1 = [pickerArray objectAtIndex:row1];
weightSelected2 = [pickerArray objectAtIndex:row2];
NSString *weightSelected = [NSString stringWithFormat:@"%@.%@", weightSelected1, weightSelected2];

Відповіді:


129

Ви можете отримати його наступним чином:

NSInteger row;
NSArray *repeatPickerData;
UIPickerView *repeatPickerView;

row = [repeatPickerView selectedRowInComponent:0];
self.strPrintRepeat = [repeatPickerData objectAtIndex:row];

2
strPrintRepeat - це не що інше, як змінна, яка зберігає значення рядка PickerView. Тобто: - NSString * strPrintRepeat.
SJS

Дякую, Джей, я працюю з моїм підбирачем, який має один компонент. Чи можете ви допомогти змінити його, хоча працювати з моїм засобом вибору, який складається з 2 компонентів? У запитання я додав точний код, який я використовую для засобу вибору 1 компонента, дякую.

4
Я не розумію цієї відповіді ... що саме таке repeatPickerData? Як це заселяється?
zakdances

@yourfriendzak repeatPickerData тут Я щойно заявив про це, але воно сюди не прийде. він з'явиться за методом viewDidLoad, і він містить значення, яке ми збираємося відобразити в UIPickerView. Дякуємо за запитання, і якщо ви все ще сумніваєтесь, то можете запросити його.
SJS

Для невеликого роз’яснення подивіться на це таким чином. NSLog (@ "% @", [self.arrayFields objectAtIndex: [self.queryPicker1 selectedRowInComponent: 0]]); Де arrayFields - це масив даних для UIPickerView. Де queryPicker1 - це UIPickerView. Де selectedRowInComponent: 0 - це перший стовпець UIPickerView (якщо у вашому засобі вибору є 2 стовпці, і ви хочете, щоб для другого значення було використано 1 замість 0).
сангонія

34

Ви можете отримати текст вибраного елемента в будь-якому розділі засобу вибору, використовуючи ту саму функцію, яку робить pickerView, із власного класу ViewController:

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

за допомогою вибраного елемента

[myPickerView selectedRowInComponent:0]

так щоб встановити текст мітки в користувацькій комірці, використовуючи поточно вибране значення з 2-го розділу myPickerView (можливо, властивість вашого контролера перегляду)

[cell.label setText:[self pickerView:myPickerView titleForRow:[myPickerView selectedRowInComponent:1] forComponent:1]];

Просто змініть обидва: 1s на: 2s тощо для кожного розділу


16
+1 - це значно краще, ніж поточна прийнята відповідь. Це зрозуміліше, не використовує дивні змінні, які не були введені чи пояснені, і не припускає (не вказуючи цього), що UIPickerViewDelegateотримує заголовки рядків з масиву. Чесно кажучи, це має бути прийнятою відповіддю.
Mark Amery

7

Це те, що я зробив:

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {

    selectedEntry = [allEntries objectAtIndex:row];

}

Значок " selectedEntrya" NSStringі міститиме вибраний на даний момент запис у режимі вибору. Я новачок у цілі C, але я думаю, що це набагато простіше.


5

Ви можете отримати доступ до вибраного рядка для даного компонента, використовуючи такий спосіб:

- (NSInteger)selectedRowInComponent:(NSInteger)component

В іншому випадку реалізація функції делегата є єдиним іншим варіантом.


Добре, на даний момент у мене є dimissPickerметод, який викликається при натисканні кнопки подати. Я хочу, щоб вибране значення було збережено або оновлено кнопку тощо, коли буде викликаний метод dysmissPicker. Як я можу це зробити? Чи потрібно додавати selectedRowInCompnentметод?

Це, мабуть, найкращий спосіб зробити це, так
drewag

Гаразд, ідеально, чи можете ви допомогти мені це налаштувати? Я щойно додав selectedRowInComponentметод, але що саме я з ним роблю. Це повинно повернути вибране значення. У мене також є 2 компоненти в клікер.

Ви можете налаштувати делегата на відстеження вибраного значення засобу вибору. Щоразу, коли користувач змінює компонент, ця функція буде викликатися. Ви можете використовувати вибраний рядок, щоб витягнути значення з масиву, який використовується для його заповнення, а потім зберегти цей стан у делегатові для подальшого доступу, коли ви хочете зберегти значення назавжди
drewag

2

Вам потрібно буде запитати у делегата вибору, як це робить ваша заявка. Ось як я це роблю з мого UIPickerViewDelegate:

func selectedRowValue(picker : UIPickerView, ic : Int) -> String {

    //Row Index
    let ir  = picker.selectedRow(inComponent: ic);

    //Value
    let val = self.pickerView(picker,
                              titleForRow:  ir,
                              forComponent: ic);
    return val!;
}

0

Ви повинні використовувати didSelectRowметод делегування, оскільки a UIPickerViewможе мати довільну кількість компонентів. Немає "objectValue" або чогось подібного, тому що це повністю залежить від вас.


0

Отримання вибраного заголовка вибору:

let component = 0
let row = picker.selectedRow(inComponent: component)
let title = picker.delegate?.pickerView?(picker, titleForRow: row, forComponent: component)

0
       NSInteger SelectedRow;
                   SelectedRow = [yourPickerView selectedRowInComponent:0];
                   selectedPickerString = [YourPickerArray objectAtIndex:SelectedRow];
                   self.YourTextField.text= selectedPickerString;

    // if  you want to move pickerview to selected row then 
 for (int i = 0; I<YourPickerArray.count; i++) {
  if ([[YourPickerArray objectAtIndex:i] isEqualToString:self.YourTextField.text]) { 
[yourPickerView selectRow:i inComponent:0 animated:NO];
 }
}

1
Коли це можливо, докладіть зусиль, щоб надати додаткові пояснення замість просто коду. Такі відповіді, як правило, є більш корисними, оскільки вони допомагають членам спільноти та особливо новим розробникам краще зрозуміти аргументи рішення та можуть допомогти уникнути необхідності вирішувати подальші питання.
Раджан

Так, звісно. Дякую за
пораду

-2
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
   weightSelected = [pickerArray objectAtIndex:row];
}

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