【问题标题】:resignFirstResponder for UIPicker in UITextField SwiftUITextField Swift 中 UIPicker 的 resignFirstResponder
【发布时间】:2014-10-26 12:52:12
【问题描述】:

我希望在单击工具栏上的完成按钮后关闭 UIPickerView(滑出视图)。我已将 UIPickerView 链接为 UITextField 的 inputView,并将 UIToolbar 设置为 UIPickerView 的 inputAccessoryView。但是,我调用 resignFirstResponder 的函数不会将 UIPicker 滑出视图。任何帮助表示赞赏并提前感谢!

import UIKit

class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate {
    // Do any additional setup after loading the view, typically from a nib.

    //initialization constants
    let pickerView = UIPickerView()
    let textField = UITextField()
    let pickerData = ["1","2","three"]


    override func viewDidLoad() {
        //pickerview tool bar
        let toolbar = UIToolbar(frame: CGRectMake(0, 0, 320, 44))
        var items = [AnyObject]()
        //making done button
        let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: Selector(donePressed()))
        items.append(doneButton)
        toolbar.barStyle = UIBarStyle.Black
        toolbar.setItems(items, animated: true)


        //creating textfields with a pickerview
        pickerView.delegate = self
        pickerView.dataSource = self
        pickerView.frame = CGRectMake(0, 0, 500, 300)
        textField.inputAccessoryView = toolbar
        textField.inputView = pickerView
        textField.frame = CGRectMake(200, 55, 100, 35)
    textField.backgroundColor = UIColor.blueColor()

    //adding objs to viewController
    self.view.addSubview(textField)
}

func donePressed() {
    resignFirstResponder()
}





override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}



}

//MARK: Data Sources UIPickerView
extension ViewController: UIPickerViewDataSource {
    func numberOfComponentsInPickerView(pickerView: UIPickerView) -> Int {
        return 1
    }
    func pickerView(pickerView: UIPickerView!, numberOfRowsInComponent component: Int) -> Int {
        return pickerData.count
    }
}

//MARK: Delegates UIPickerView
extension ViewController: UIPickerViewDelegate {
    // several optional methods:




func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! {
    return pickerData[row]
}

func pickerView(pickerView: UIPickerView!, didSelectRow row: Int, inComponent component: Int) {
    textField.text = pickerData[row]
}
}

【问题讨论】:

    标签: ios swift uitextfield uipickerview uitoolbar


    【解决方案1】:

    有2个问题:

    1. donePressed 的选择器声明不正确。应该是:

      let doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "donePressed")
      
    2. 您需要在textField 上致电resignFirstResponder()

      func donePressed() {
          textField.resignFirstResponder()
      }
      

    如果您有多个文本字段,并且不想在 resignFirstResponder 调用中对文本字段进行硬编码,则可以执行以下操作:

    1. 将您的ViewController 设为UITextFieldDeletate

      class ViewController: UIViewController, UIPickerViewDataSource, UIPickerViewDelegate, UITextFieldDelegate {
      
    2. UITextField 上设置delegate 属性:

      textField.delegate = self
      
    3. 将属性添加到您的ViewController 以跟踪活动的UITextField

      var activeTextField:UITextField?
      
    4. 实现textFieldDidBeginEditing并存储活动的UITextField

      func textFieldDidBeginEditing(textField: UITextField) { // became first responder
          activeTextField = textField
      }
      
    5. donePressed,拨打resignFirstResponderactiveTextField

      func donePressed() {
          activeTextField?.resignFirstResponder()
      }
      

    【讨论】:

    • 为了扩展第二个问题,如果我有多个 UITextFields 与单独的 UIPickerViews 链接怎么办。有没有办法通过函数 donePressed() 传递活动文本字段?
    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多