【问题标题】:How to Show UIPickerView when selecting UITextField选择 UITextField 时如何显示 UIPickerView
【发布时间】:2011-08-16 11:10:15
【问题描述】:

这是我到目前为止所做的截图:

所以我想要做的是当你选择“选择一个名字”文本字段时,我需要一个 Picker 来显示,输入 @“Jack”。

【问题讨论】:

  • 设置 并将文本字段与界面生成器中的委托连接起来,对于 UIPiickrView..

标签: ios objective-c uitextfield uipickerview


【解决方案1】:

从 iOS 3.2 开始,UITextField 支持 inputView 属性来分配自定义视图以用作键盘,这提供了一种显示 UIPickerView 的方法:

您可以使用UITextFieldinputView 属性,可能与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;

【讨论】:

  • 我正在按照您在此处所说的操作并将工具栏分配给我的 inputAccessoryView,但工具栏缺少背景,并且灵活空间似乎不起作用。这里唯一的区别是我在 XIB 中创建了工具栏。你知道可能出了什么问题吗?
  • 好的 - 我让它工作了,虽然我没有解释。我将工具栏创建为父视图(scrollview)的子视图,但我所做的是在子视图之外创建视图(插座仍然连接),然后在代码中分配了 inputAccessoryView,如上所示,并且有效!
  • 谢谢。 -(void) inputAccessoryViewDidFinish { [self.myTextField resignFirstResponder]; }
【解决方案2】:

我使用它并发现它比添加子视图和动画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;
}

【讨论】:

    【解决方案3】:

    它会为你工作..我已经编辑了它。为此你必须为文本字段设置委托。并在 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;
    }
    

    【讨论】:

    • 请先阅读我的第一条评论。我收到 1 个错误:“pickrView 未声明”
    • IBOutlet UIPickerView *pickrView;把它写在你的界面中,然后用你的pickr把它连接到nib文件中。
    • 构建成功:D,但它会在不到 1 秒的时间内打开和关闭黑屏
    • 我不知道,但我认为可能还有其他问题。因此,首先您必须了解什么是委托、控制器和一些基础知识。。
    • 不,我认为您在释放效果方面没有遇到问题?
    【解决方案4】:

    好吧,您可以依靠UITextFieldDelegate 来处理这种功能。

    里面

    - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

    是您设置当前UITextField 的文本以及初始化和显示UIPickerView 的位置。

    重要提示:

    您可能还想遵守UIPickerViewDelegate

    HTH

    【讨论】:

      【解决方案5】:

      斯威夫特:

      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
      

      【讨论】:

        【解决方案6】:

        您可以做的是,在UITextField 上创建一个具有自定义类型的UIButton。两者具有相同的大小。轻触按钮即可显示UIPickerView

        【讨论】:

          【解决方案7】:

          http://tmblr.co/ZjkSZteCOUBS

          我的博客中有代码和所有内容,可以准确地做到这一点。但在下面,我列出了基本概念。

          基本上,该解决方案涉及在 github 上名为 ActionSheetPicker 的开源项目,并在 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;
          }
          

          【讨论】:

          • 请注意,您应该在此处或此站点上发布有用的答案点,否则您的帖子可能会被删除为"Not an Answer"。如果您愿意,您仍然可以包含该链接,但仅作为“参考”。答案应该是独立的,不需要链接。
          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多