如何在 uialertview 中添加 uipickerview swift 3

how to add uipickerview in uialertview swift 3

Swift 3 iOS 10: 我想在 UIAlertView 中添加 UIPickerView 以便我可以选择项目和将它的值设置为 textField。我可以用 UIView 来做,但我想以更好、更自然的方式改进它。是否可以这样做或有什么出路?

提前致谢!

这就是我所做的,

Pix1:我的文本框https://z-p3-scontent.fpnh5-1.fna.fbcdn.net/v/t1.0-9/19702221_1969127863363332_1282515913735651533_n.jpg?oh=ece774626e6691c531dc69b168104fcc&oe=59D72E14

Pix2:我的警报: https://z-p3-scontent.fpnh5-1.fna.fbcdn.net/v/t1.0-9/19665630_1969127860029999_9139151345242136168_n.jpg?oh=d56be1efc3bd772ff68e7e45fa7ebfae&oe=5A0F290F

虽然 Apple 建议我们不要这样做,但您确实可以将选择器视图添加到您的警报视图控制器。 UIAlertViewController 除了普通的视图控制器之外没有什么神奇的。您需要做的就是显示带有大量新行的标题文本(即"Select\n\n\n\n\n\n\n\n\n\n\n\n")以增加警报高度,然后调用alertViewController.addSubview(datePicker)

然而,问题是为什么您需要编写额外的代码来操作警报视图控制器并处理要设置值的文本字段?这是另一种更易于维护和实施的方法。

首先创建您的选择器视图并对其进行配置。

let picker = UIPickerView()
picker.delegate = self
picker.dateSource = self
// configure

然后对于您的每个文本字段,只需调用此

tf1.tag = 1
tf2.tag = 2
tf3.tag = 3

tf1.delegate = self
tf2.delegate = self
tf3.delegate = self

tf1.inputView = picker
tf2.inputView = picker
tf3.inputView = picker

不在您的文本字段委托方法中,存储用户单击的文本字段并重新加载选择器视图数据

var tfTag = 0

func textFieldDidBeginEditing(_ textField: UITextField) {
    tfTag = textField.tag
    picker.reloadAllComponents()
}

最后,在所有选择器视图数据源或委托方法中,根据每个文本字段的唯一标签号加载不同的数据库集

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    if tfTag == 0 {
        if component == 0 {
            return "1"
        }else if component == 1 {
            return "2"
        }else if component == 2 {
            return "3"
        }else{
            return "4"
        }
    }else if tfTag == 1 {
        //...
    }else{
        //...
    }
}