【问题标题】:Show custom inputView/Keyboard by tapping on UIBarButtonItem通过点击 UIBarButtonItem 显示自定义 inputView/Keyboard
【发布时间】:2016-01-28 03:31:54
【问题描述】:

我想在点击工具栏按钮 (UIBarButtonItem) 时显示自定义日期选择器键盘。

对于使用UIResponderinputView 显示自定义键盘似乎是正确的选择。不幸的是 UIBarButtonItem 不是 UIResponder 的子类。

我怎样才能拥有一个 UIBarButtonItembecomeFirstResponder 并携带一个 inputView 来显示这样的键盘?

【问题讨论】:

    标签: ios objective-c swift keyboard uiresponder


    【解决方案1】:

    为什么要在用户点击 UIBarButtonItem 时显示键盘? 假设在点击 UIBarButtonItem 时显示键盘,当用户使用键盘输入内容时会发生什么?哪个控件应该从键盘接收按键事件?

    【讨论】:

    • 这就是我想用日期选择器代替键盘的地方。
    【解决方案2】:

    除了 inputView 方法,您可以按照另一种方法在按钮单击时显示 datePicker

    showDatePicker是按钮点击时调用的方法

    -(void)showDatePicker
        {
    
        UIDatePicker* picker = [[UIDatePicker alloc] init];
                            picker.autoresizingMask = UIViewAutoresizingFlexibleWidth;
                            picker.datePickerMode = UIDatePickerModeDate;
    
        [picker addTarget:self action:@selector(dueDateChanged:) forControlEvents:UIControlEventValueChanged];
                            CGSize pickerSize = [picker sizeThatFits:CGSizeZero];
                            picker.frame = CGRectMake(0.0, 250, pickerSize.width, 460);
                            picker.backgroundColor = [UIColor blackColor];
                            [self.view addSubview:picker];
        }
    
    
    -(void) dueDateChanged:(UIDatePicker *)sender {
        NSDateFormatter* dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
        [dateFormatter setDateStyle:NSDateFormatterLongStyle];
        [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
    
        //self.myLabel.text = [dateFormatter stringFromDate:[dueDatePickerView date]];
        NSLog(@"Picked the date %@", [dateFormatter stringFromDate:[sender date]]);
    }
    

    要删除 datePicker,您可以使用 removeFromSuperView 在从另一个按钮调用的方法中单击 View 或自定义 toolbar done 按钮。

    【讨论】:

    • 我不想替换整个屏幕内容来显示选择器。它应该只替换键盘视图。此外,我真的不希望重新构建日期选择器视图的所有显示/隐藏/调整大小逻辑,除非我真的必须……
    【解决方案3】:

    我已经通过创建 UITextField 来实现这一点

    let myPicker = UIPickerView()
    lazy var pickerInputField: UITextField = {
      let field = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
      self.view.addsubview(field)
      field.delegate = self
      return field
    }()
    
    func barButtonItemTouched(sender: Any) {
    
      // dismiss the picker if it's showing
      if pickerInputField.isFirstResponder {
        pickerInputField.resignFirstResponder()
      }
    
      pickerInputField.inputView = myPicker
      pickerInputField.becomeFirstResponder() 
    }
    

    【讨论】:

      猜你喜欢
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 2016-02-29
      • 2012-06-15
      • 2020-11-27
      相关资源
      最近更新 更多