2017-01-16 29 views
1

Here's an example。我还有其他的警报与文本框和其他选择器视图,但与这两个都是一个痛苦。从UIPickerview中获取文本并在UIAlert内移动Textfield

let gradeTypeTextField = gradeTypeTextField (Doesn't work) 

var gradeTypeTextField: UITextField! 

@IBAction func newGrade(_ sender: AnyObject) { 
When button is tapped, show alert. 
    alertForGrade() 
} 

var gradeType = ["Attendance", "Assignment", "Homework Assignment", "Quiz", "Test", "Mid-Term", "Exam", "Other"] 


override func viewDidLoad() { 
    super.viewDidLoad() 

    Hide extra cells 
    tableView.tableFooterView = UIView() 

} 


func alertForGrade() { 

    Create the alert controller. 
alert = UIAlertController(title: "New Grade", message: nil, preferredStyle: .alert); 


    Add the text field. You can configure it however you need. 
    alert?.addTextField(configurationHandler: { (gradeTypeTextField) -> Void in 

     gradeTypeTextField.placeholder = "Type of Grade." 

     let pickerView = UIPickerView() 
     pickerView.delegate = self 
     pickerView.dataSource = self 
     pickerView.backgroundColor = UIColor.white 
     pickerView.showsSelectionIndicator = true 
     gradeTypeTextField.inputView = pickerView 
     self.view.endEditing(true) 

    }) 

    alert?.addTextField(configurationHandler: { (assignmentTextField) -> Void in 
     assignmentTextField.placeholder = "Name of the assignment." 

    }) 

    alert?.addTextField(configurationHandler: { (gradeTextField) -> Void in gradeTextField.placeholder = "Grade for the assignment." 

     Grab the value from the text field, and print it when the user clicks OK. 
     let ok = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in 
      let assignmenttextField = (self.alert?.textFields![0])! as UITextField 

      let gradeTextField = (self.alert?.textFields![1])! as UITextField 
      let assignment = assignmenttextField.text! 

      let gradeString = gradeTextField.text! 

      let grade = Int(gradeString) 

      self.dictionaryForGradebook.updateValue(grade!, forKey: assignment) 

      print(self.dictionaryForGradebook) 

      self.tableView.reloadData() 
     }) 


     self.alert?.addAction(ok) 
     self.alert?.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: { (action) -> Void in 


     })) 

     // 4. Present the alert. 
     self.present(self.alert!, animated: true, completion: nil) 


    }) 


} 


func numberOfComponents(in pickerView: UIPickerView) -> Int { 

    return 1 
} 

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

    return gradeType.count 
} 

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

    return gradeType[row] 
} 


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

This prints but if I try " yearTextField.text = years[row]" it crashes. 
      print("Testinggggg") 

    self.view.endEditing(true) 


} 

isuue在哪里?

回答

0

当您在UIPicker中选择一行时,您需要能够在稍后尝试添加文本时参考您创建的UITextField。你似乎忘记地方链接:

alert?.addTextField(configurationHandler: { (gradeTypeTextField) -> Void in 

    // Append this: 
    self.gradeTypeTextField = gradeTypeTextField 

    gradeTypeTextField.placeholder = "Type of Grade." 

    let pickerView = UIPickerView() 
    pickerView.delegate = self 
    pickerView.dataSource = self 
    pickerView.backgroundColor = UIColor.white 
    pickerView.showsSelectionIndicator = true 
    gradeTypeTextField.inputView = pickerView 
    self.view.endEditing(true) 

}) 

然而,这将创建一个保留周期,因此是建议通过增加[weak self]你开始关闭,以创建无主/弱自链接。

+0

在这个函数:函数pickerView(_ pickerView:UIPickerView,didSelectRow行:中等,inComponent组分的:int){// 的打印语句的工作,但其它代码导致崩溃 gradeTypeTextField.text = gradeType [行] print(“Testinggggg”) self.view.endEditing(true) } – Quintsanity