Как показать UIPickerView при выборе UITextField - PullRequest
19 голосов
/ 16 августа 2011

Вот скриншот того, что я делал до сих пор:

enter image description here

Так что я пытаюсь сделать, когда вы выбираете текстовое поле «выбрать имя» Мне нужен сборщикчтобы показать, с помощью ввода @ "Джек".

Ответы [ 8 ]

67 голосов
/ 16 августа 2011

Начиная с iOS 3.2, UITextField поддерживает свойство inputView для назначения настраиваемого представления для использования в качестве клавиатуры, что обеспечивает способ отображения UIPickerView:

. Вы можете использовать inputView свойство UITextField, возможно, в сочетании со свойством inputAccessoryView.Вы присваиваете свой pickerView свойству inputView, а для отмены средства выбора - кнопку готово для свойства inputAccessoryView.

UIPickerView *myPickerView = [[UIPickerView alloc] init];
//myPickerView configuration here...
myTextField.inputView = myPickerView;

Вот так.Это не даст вам прямого способа отклонить представление, поскольку у вашего UIPickerView нет кнопки возврата, поэтому я рекомендую использовать свойство inputAccessoryView для отображения панели инструментов с кнопкой «Готово» (панель предназначена только для эстетики,Вы также можете просто использовать объект UIButton):

UIToolbar *myToolbar = [[UIToolbar alloc] initWithFrame:
 CGRectMake(0,0, 320, 44)]; //should code with variables to support view resizing
UIBarButtonItem *doneButton =
 [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone
 target:self action:@selector(inputAccessoryViewDidFinish)];
 //using default text field delegate method here, here you could call
 //myTextField.resignFirstResponder to dismiss the views
[myToolbar setItems:[NSArray arrayWithObject: doneButton] animated:NO];
myTextField.inputAccessoryView = myToolbar;
14 голосов
/ 05 марта 2013

Я использую это и нахожу это намного чище, чем добавление подпредставления и анимация UIPicker

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
responder = textField;

    if ([textField isEqual:self.txtBirthday]) {
    UIDatePicker *datepicker = [[UIDatePicker alloc] initWithFrame:CGRectZero];
    [datepicker setDatePickerMode:UIDatePickerModeDate];

    textField.inputView = datepicker;
    }

    return YES;
}
4 голосов
/ 16 августа 2011

это будет работать для вас .. я отредактировал его. И для этого вы должны установить делегат для текстового поля.и создайте UIPIckrView в NIb-файле.

- (BOOL) textFieldShouldBeginEditing:(UITextView *)textView
{
    pickrView.frame = CGRectMake(0, 500, pickrView.frame.size.width,    pickrView.frame.size.height);
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:.50];
    [UIView setAnimationDelegate:self];
    pickrView.frame = CGRectMake(0, 200, pickrView.frame.size.width, pickrView.frame.size.height);
    [self.view addSubview:pickrView];
    [UIView commitAnimations];
    return NO;
}
2 голосов
/ 16 августа 2011

Ну, вы могли бы положиться на UITextFieldDelegate для обработки такого рода функциональности.

Внутри

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

- это место, где вы должны установить текст текущего UITextField, а также инициализацию и отображение UIPickerView.

Важное замечание:

Возможно, вы также захотите соответствовать UIPickerViewDelegate.

НТН

1 голос
/ 17 сентября 2017

Swift:

internal var textFieldHandlerToolBar: UIToolbar = {
    let tb = UIToolbar.init(frame: CGRect.init(origin: .zero, size: CGSize.init(width: UIScreen.main.bounds.width, height: 44.0)))
    let doneBarButton = UIBarButtonItem.init(title: "Done", style: UIBarButtonItemStyle.done, target: self, action: #selector(actionDonePickerSelection))
    tb.setItems([doneBarButton], animated: false)
    return tb
}()

internal var pickerView: UIPickerView = {
    let pv = UIPickerView.init()
    return pv
}()

@objc internal func actionDonePickerSelection() {
     textField.resignFirstResponder()
}

override func viewDidLoad() {
    super.viewDidLoad()
    self.pickerView.delegate = self
    self.pickerView.datasource = self
}

Используйте это так:

textField.inputAccessoryView = self.textFieldHandlerToolBar
textField.inputView = self.pickerView
0 голосов
/ 17 февраля 2016

ViewController.h

@interface ChangeCurrencyVC : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate>
{
      NSArray *availableCurreniesArray;
}
@property (weak, nonatomic) IBOutlet UITextField *chooseCurrencyTxtFldRef;

ViewController.m

 - (void)viewDidLoad {
[super viewDidLoad];
availableCurreniesArray = @[@"Indian Rupee", @"US Dollar", @"European Union Euro", @"Canadian Dollar", @"Australian Dollar", @"Singapore Dollar", @"British Pound", @"Japanese Yen"];
// Do any additional setup after loading the view.
[self pickerview:self];
}

 #pragma mark -  picker view Custom Method
 -(void)pickerview:(id)sender{
  UIPickerView *pickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;

// set change the inputView (default is keyboard) to UIPickerView
self.chooseCurrencyTxtFldRef.inputView = pickerView;

// add a toolbar with Cancel & Done button
UIToolbar *toolBar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
toolBar.barStyle = UIBarStyleBlackOpaque;

UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneTouched:)];
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelTouched:)];
// the middle button is to make the Done button align to right
[toolBar setItems:[NSArray arrayWithObjects:cancelButton, [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil], doneButton, nil]];
self.chooseCurrencyTxtFldRef.inputAccessoryView = toolBar;
}
 #pragma mark - doneTouched
- (void)cancelTouched:(UIBarButtonItem *)sender{
// hide the picker view
[self.chooseCurrencyTxtFldRef resignFirstResponder];
 }
  #pragma mark - doneTouched
- (void)doneTouched:(UIBarButtonItem *)sender{
// hide the picker view
[self.chooseCurrencyTxtFldRef resignFirstResponder];
// perform some action
 }
#pragma mark - The Picker Challenge
- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1;
}
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{
return [availableCurreniesArray count];
}
- (nullable NSString *)pickerView:(UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component{
return availableCurreniesArray[row];
}

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
self.chooseCurrencyTxtFldRef.text = availableCurreniesArray[row];
}
0 голосов
/ 19 ноября 2012

http://tmblr.co/ZjkSZteCOUBS

У меня есть код и все, что выложено в моем блоге, чтобы сделать это точно. Но ниже я изложил основную концепцию.

В основном решение включает в себя проект с открытым исходным кодом ActionSheetPicker на github и реализацию функции textFieldShouldBeginEditing на UITextFieldDelegate. Вы можете отклонить клавиатуру там и вместо этого предоставить UIPickerView. Базовый код указан здесь:

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
    // We are now showing the UIPickerViewer instead

    // Close the keypad if it is showing
    [self.superview endEditing:YES];

    // Function to show the picker view
    [self showPickerViewer :array :pickerTitle];

    // Return no so that no cursor is shown in the text box
    return  NO;
}
0 голосов
/ 16 августа 2011

Что вы можете сделать, это создать UIButton с пользовательским типом на UITextField. Оба имеют одинаковые размеры. При нажатии на кнопку вы можете показать UIPickerView.

...