UIPickerView 行为异常

UIPickerView Behaving Erratically

所以我觉得问这个很愚蠢,但我根本无法弄清楚出了什么问题。基本上,当我单击具有 UIPickerView 作为其 inputView 的文本字段时,它会很快显示然后消失。但是,工具栏(它的 accessoryView 仍然保留在屏幕上)。我还没有在网上看到其他人有过这种经历,所以这就是为什么我不得不在 SO 上问它的原因。

一开始以为是我设置pickerView的.isHidden属性的时候有什么关系。但是我忽略了那些无效的调用。

因此,我将包括与我的 pickerView 相关的所有代码,因为我真的不知道问题出在哪里。我确定这是我遗漏的一些小问题,但我们将不胜感激。

class myAssessmentsViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource, UITextFieldDelegate {

@IBOutlet weak var contentSelectionTextField: UITextField!
@IBOutlet weak var contentOrderingTextField: UITextField!

var contentSelectionPickerView: UIPickerView = UIPickerView()
var contentOrderingPickerView: UIPickerView = UIPickerView()

var contentSelectionOptions: [String] = ["All", "Physics HL", "Chemistry HL", "Spanish Ab SL"]
var contentOrderingOptions: [String] = ["Date", "Subject", "Grade", "Title"]

required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)

}

override func viewDidLoad() {
    super.viewDidLoad()

    contentSelectionPickerView.tag = 1 //for the delegate methods
    contentSelectionPickerView.isHidden = true //commenting this out did nothing
    contentSelectionPickerView.delegate = self
    contentSelectionPickerView.dataSource = self

    contentSelectionTextField.inputView = contentSelectionPickerView //set pickerView as responder
    contentSelectionTextField.delegate = self

    contentOrderingPickerView.tag = 2 //for the delegate methods
    contentOrderingPickerView.isHidden = true //commenting this out also did nothing
    contentOrderingPickerView.delegate = self
    contentOrderingPickerView.dataSource = self

    initializePickerViewToolBar(clearButtonFunc: "clearPressedContentSelectionPickerView", doneButtonFunc: "donePressedContentSelectionPickerView", textField: contentSelectionTextField)
    initializePickerViewToolBar(clearButtonFunc: "clearPressedContentOrderingPickerView", doneButtonFunc: "donePressedContentOrderingPickerView", textField: contentOrderingTextField)

    contentOrderingTextField.inputView = contentOrderingPickerView //set pickerView as responder
    contentOrderingTextField.delegate = self


    // Do any additional setup after loading the view.
}

func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1 //same for both pickers
}

func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {

    if pickerView.tag == 1 { //contentSelectionPickerView
        return contentSelectionOptions.count
    } else if pickerView.tag == 2 { //contentOrderingPickerView
        return contentOrderingOptions.count
    } else {
        return 1
    }

}

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

    self.view.endEditing(true)

    if pickerView.tag == 1 { //contentSelectionPickerView
        return contentSelectionOptions[row]
    } else if pickerView.tag == 2 { //contentOrderingPickerView
        return contentOrderingOptions[row]
    } else {
        return "1"
    }

}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {

    if pickerView.tag == 1 {
        contentSelectionTextField.text = contentSelectionOptions[row]
    } else if pickerView.tag == 2 {
        contentOrderingTextField.text = contentOrderingOptions[row]
    }

}

func textFieldDidBeginEditing(_ textField: UITextField) {

    if textField == contentSelectionTextField {
        contentSelectionPickerView.isHidden = false //also was not source of problem
    } else if textField == contentOrderingTextField {
        contentOrderingPickerView.isHidden = false //same here
    }

}

func donePressedContentSelectionPickerView(){
    contentSelectionTextField.resignFirstResponder()
}
func donePressedContentOrderingPickerView(){
    contentOrderingTextField.resignFirstResponder()
}

func clearPressedContentSelectionPickerView(){
    contentSelectionTextField.resignFirstResponder()
    contentSelectionTextField.text = ""
}
func clearPressedContentOrderingPickerView(){
    contentOrderingTextField.resignFirstResponder()
    contentOrderingTextField.text = ""
}

func initializePickerViewToolBar(clearButtonFunc: String, doneButtonFunc: String, textField: UITextField){

    let toolBar = UIToolbar(frame: CGRect(x: 0, y: textField.frame.size.height/6, width:  textField.frame.size.width, height: 40.0))
    toolBar.layer.position = CGPoint(x: textField.frame.size.width/2, y: textField.frame.size.height-20.0)
    toolBar.barStyle = .default
    toolBar.tintColor = UIColor.black

    let clearButton = UIBarButtonItem(title: "Clear", style: .plain, target: self, action: Selector(clearButtonFunc))
    let doneButton = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: Selector(doneButtonFunc))
    let flexSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil)

    toolBar.setItems([clearButton,flexSpace,doneButton], animated: true)
    toolBar.isUserInteractionEnabled = true

    textField.inputAccessoryView = toolBar

}

}

这里还有一张我说的视觉效果的照片。正如您在屏幕底部看到的,accessoryView 仍然可见,但内容不可见。我认为 accessoryView 将是 UIPickerView 的子视图,并且它们会一起消失,但事实显然并非如此。

再次对所有代码(和大图)表示歉意,我知道要通读的内容很多,但是任何见解都将不胜感激!

所以事实证明,我所关注的 SO 的一个答案告诉我在我的 pickerViewTitleForRow 委托方法中包含 self.view.endEditing(true) 。这意味着无论何时设置标题,都会解雇第一响应者,从而导致此问题。删除它导致问题消失。感谢@MikeTaverne 指出。