Here's an example .我有其他带有文本字段的警报和其他带有选择器 View 的警报,但是同时使用这两种 View 很痛苦。
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)
}
问题出在哪里?
最佳答案
稍后当您在 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]
添加到闭包的开头来创建一个无主/弱自链接。
关于ios - 从 UIPickerview 获取文本并在 UIAlert 中移动 Textfield,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41684455/