Voici une capture d'écran de ce que j'ai fait jusqu'à maintenant:
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".
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;
}
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;
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;
}
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
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];
}
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
.
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
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;
}