如何在选择UITextField时显示UIPickerView

20
这是我目前所做的截图:

enter image description here

因此,我想做的是当你选择 "pick a name" 文本字段时,我需要一个选择器出现,并输入 @"Jack"。

在界面构建器中设置<UITextFieldDelegate>并将文本字段与委托连接起来,对于UIPickrView也是如此。 - PJR
8个回答

68

自从iOS 3.2版本以来,UITextField支持inputView属性来分配一个自定义视图作为键盘使用,可以通过它显示一个UIPickerView

你可以使用UITextFieldinputView属性,可能结合inputAccessoryView属性。将你的pickerView分配给inputView属性,并在inputAccessoryView属性中放置一个完成按钮来关闭选择器。

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

像这样。这并不会给您一个直接的方法来 dismiss 视图,因为您的 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;

我正在按照你在这里说的做,并将工具栏分配给我的inputAccessoryView,但是工具栏的背景丢失了,而且弹性空间似乎不起作用。唯一的区别是我在XIB中创建了工具栏。你知道可能出了什么问题吗? - RPM
好的 - 我让它工作了,虽然我没有解释。我正在将工具栏创建为父视图(滚动视图)的子视图,但我所做的是在子视图之外创建视图(输出仍然连接),然后在代码中分配输入辅助视图,就像您上面展示的那样,这样就可以工作了! - RPM
2
谢谢。 -(void) inputAccessoryViewDidFinish { [self.myTextField resignFirstResponder]; } - Baryon Lee

14

我使用这个方法,发现它比添加子视图并动画显示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

它会对你有用..我已经编辑了它。为此,您需要为textfield设置delegate,并在NIb文件中创建一个UIPIckrView。

- (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;
}

请先阅读我的第一条评论。我遇到了一个错误:“pickrView未声明”。 - sillersam
在你的接口中写下 IBOutlet UIPickerView *pickrView; 并在 nib 文件中连接它与你的 pickr。 - PJR
构建成功:D,但它在不到1秒的时间内打开并关闭了一个黑屏。 - sillersam
我不确定,但我认为可能存在其他问题。因此,首先您必须了解什么是委托、控制器和一些基础知识。 - PJR
好的,你能给我做一个快速的程序并提供源代码吗?我会很感激的,并通过 PayPal 或 AlertPay 给你捐赠 :D - sillersam
显示剩余2条评论

2

嗯,您可以依靠UITextFieldDelegate来处理此类功能。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

中,您可以设置当前UITextField的文本,并初始化和显示UIPickerView

重要提示:

您可能还想符合UIPickerViewDelegate

希望对您有所帮助。


1

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

http://tmblr.co/ZjkSZteCOUBS

我在我的博客中已经有了代码和所有的布局,可以完全实现这个功能。但是下面,我将基本概念列出。

基本上,解决方案涉及到一个名为ActionSheetPicker的开源项目,它在github上,并且实现UITextFieldDelegate上的textFieldShouldBeginEditing函数。你可以在那里关闭键盘并提供一个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;
}

请注意,您应该在此网站上发布答案的有用要点,否则您的帖子可能会被删除为“不是答案”(http://meta.stackexchange.com/q/8259)。 如果您愿意,仍然可以包含链接,但仅作为“参考”。 答案应该能够独立存在,而不需要链接。 - Andrew Barber

0

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
你可以创建一个自定义类型的 UIButton 和一个大小相等的 UITextField。当按钮被点击时,你可以显示 UIPickerView

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接