2016-12-27 10 views
0

Так что я чувствую себя глупо, спрашивая об этом, но я просто не могу понять, что происходит не так. В принципе, когда я нажимаю textField с UIPickerView как inputView, он будет отображаться очень быстро, а затем исчезает. Однако toolBar (его accessoryView все еще остается на экране). Я не видел никого другого в Интернете, который испытал это, поэтому я должен был спросить об этом.UIPickerView Behavior Erratically

Сначала я подумал, что с этим что-то было, когда я устанавливал свойство 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 

} 

} 

Вот также фотография того, что я говорю о визуально. Как видите в нижней части экрана, аксессуар еще видится, но контент отсутствует. Я бы подумал, что accessView будет подпунктом UIPickerView и что они исчезнут вместе, но это, по-видимому, не так.

The issue

Опять извинения за весь код (и большое изображение), я знаю, что это много, чтобы прочитать, но любое понимание было бы весьма признателен!

+0

Что это за линия в вашем названииForRow? self.view.endEditing (true) –

+1

@MikeTaverne Wow Я не знаю, почему я не исследовал это дальше, когда увидел это. Это было полностью спасибо! –

+0

Рад, что это сработало! –

ответ

0

Итак, выяснилось, что один из ответов от SO, за которым я следовал, сказал мне включить self.view.endEditing(true) в мой метод делегата pickerViewTitleForRow. Это означало, что всякий раз, когда устанавливались заголовки, первый ответчик увольнялся, что вызывало эту проблему. Из-за этого проблема исчезла. Спасибо @MikeTaverne за указание на это.