2016-12-27 59 views
0

所以我覺得這個問題很愚蠢,但我根本搞不清楚會出現什麼問題。基本上,當我點擊一個具有UIPickerView的textField作爲其inputView時,它會很快顯示然後消失。但是,工具欄(其accessoryView仍保留在屏幕上)。我還沒有看到任何經歷過這一點的在線人士,所以這就是爲什麼我不得不問這個問題。UIPickerView行爲不正常

起初我以爲它在設置pickerView的.isHidden屬性時有些事。但是我忽略了這些電話沒有效果。因此,我將包括所有與我的pickerViews相關的代碼,因爲我真的不知道問題出在哪裏。我相信這是我錯過的小事,但任何幫助將不勝感激。

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的子視圖,它們會一起消失,但顯然並非如此。

The issue

再次,對於所有的代碼道歉(和大圖片),我知道這是一個很大讀通過,但任何有識之士將不勝感激!

+0

您的titleForRow中的這條線是什麼? self.view.endEditing(true) –

+1

@MikeTaverne哇我不知道爲什麼當我看到它時沒有進一步調查。這完全是謝謝你! –

+0

很高興工作! –

回答

0

因此,事實證明,我接下來的答案之一告訴我在我的pickerViewTitleForRow委託方法中包含self.view.endEditing(true)。這意味着無論何時設置標題,第一個響應者都被解僱,造成這個問題。刪除它導致問題消失。感謝@MikeTaverne指出。