2017-01-16 37 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