ios - 从 UIPickerview 获取文本并在 UIAlert 中移动 Textfield

标签 ios swift uitextfield

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/

相关文章:

ios - 制作非可变对象的可变副本的首选方法?

ios - 多人 iOS 游戏架构......你能将所有连接合并到一个游戏场景中吗?

ios - 如何在 UIAlertController 中添加 textField?

ios - UITextField:textRectForBounds:与。编辑 RectForBounds:

ios - viewWillLayoutSubviews 和旋转

ios - UITableView 滚动条随着用户滚动而改变大小

swift - 无法强制将类型 'UIViewController' 的值转换为类型 'TableView'

swift - 如何在 Swift 中每 5 秒运行一次带参数的函数?

ios - ScrollView 当键盘出现时不滚动 如果 ContentView 中的元素

ios - 我的 iAd 代码有问题吗?