web-dev-qa-db-fra.com

Comment afficher UIPickerView lors de la sélection de UITextField

Voici une capture d'écran de ce que j'ai fait jusqu'à maintenant:

enter image description here

Donc, ce que j'essaie de faire, c'est lorsque vous sélectionnez "Choisissez un nom", vous avez besoin d'un sélecteur pour afficher, avec l'entrée @ "Jack".

19
sillersam

cela fonctionnera pour vous .. je l'ai édité. Et pour cela, vous devez définir délégué pour textfield. et créez un fichier UIPIckerView dans 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;
}
4
PJR

Depuis iOS 3.2, UITextField prend en charge la propriété inputView pour attribuer un affichage personnalisé à utiliser comme clavier, ce qui permet d'afficher une UIPickerView:

Vous pouvez utiliser la propriété inputView de la UITextField, probablement combinée à la propriété inputAccessoryView. Vous affectez votre pickerView à la propriété inputView et, pour fermer le sélecteur, un bouton done à la propriété inputAccessoryView.

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

Comme ça. Cela ne vous donnera pas un moyen direct de fermer la vue puisque votre UIPickerView n'a pas de bouton de retour. C'est pourquoi je vous recommande d'utiliser la propriété inputAccessoryView pour afficher une barre d'outils avec un bouton done (la barre est juste pour l'esthétique utilisez simplement un objet 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;
67
Tom

J'utilise ceci et trouve cela beaucoup plus propre que d'ajouter une sous-vue et d'animer la 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;
}
14
thesummersign

Eh bien, vous pouvez vous fier à la UITextFieldDelegate pour gérer ce type de fonctionnalité.

À l'intérieur de

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

est l'endroit où vous souhaitez définir le texte de votre UITextField actuel, ainsi que l'initialisation et l'affichage de UIPickerView.

Avis important:

Vous pouvez également vouloir vous conformer à la UIPickerViewDelegate .

HTH

2
Faizan S.

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
Mannam Brahmam

Ce que vous pouvez faire est de créer une UIButton avec un type personnalisé sur UITextField. Les deux ayant des tailles égales. Sur simple pression de bouton, vous pouvez afficher UIPickerView.

0
Nitish

Rapide:

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
}

Utilisez-le comme ceci:

textField.inputAccessoryView = self.textFieldHandlerToolBar
textField.inputView = self.pickerView
0
Hemang

http://tmblr.co/ZjkSZteCOUBS

J'ai le code et tout ce qui est exposé dans mon blog pour le faire exactement. Mais ci-dessous, j'ai le concept de base exposé.

Fondamentalement, la solution implique un projet opensource appelé ActionSheetPicker sur github et l'implémentation de la fonction textFieldShouldBeginEditing sur UITextFieldDelegate. Vous pouvez y supprimer le clavier et fournir un UIPickerView à la place. Le code de base est listé ici:

- (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
KVISH