从自定义组件

时间:2017-08-28 19:07:00

标签: swift swift3 uitextfield uikit uidatepicker

我有一个自定义UIView组件,其中包含UITextFieldUIImageView和另一个UIView

我需要更改UITextField的行为,以便在点按时显示UIDatePicker。这是我正在尝试执行的代码,但由于某种原因,datePicker在被点击时不会打开:

class TextFieldWithFeedback : UIView {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var underlineView: UIView!

    override func draw(_ rect: CGRect) {
        let datePicker = UIDatePicker()
        datePicker.datePickerMode = .date
        self.textField.inputView = datePicker
    }
}

当我在我的ViewController(下面的代码)上使用相同的代码时,它起作用了:

override func viewDidLoad() {
    super.viewDidLoad()

    let datePicker = UIDatePicker()
    datePicker.datePickerMode = .date
    customView.textField.inputView = datePicker
}

现在,这个解决方案有效,但它并不理想,因为我有8个自定义视图,最好设置一次而不是8次。

我应该使用View类的哪个方法来设置datePicker?因为绘制不起作用。

另外,当用户选择日期时,如何附加函数来修改UITextField值?

2 个答案:

答案 0 :(得分:1)

管理解决这个问题:

//To control whether or not to use the DatePicker, easily customized on the Storyboard
@IBInspectable var useDatePicker: Bool = false

@IBAction func textFieldEditing(_ sender: UITextField) {
    self.textFieldStartedEditing(sender: sender)
}

func textFieldStartedEditing(sender: UITextField) {
    if useDatePicker {
        let datePickerView:UIDatePicker = UIDatePicker()
        datePickerView.datePickerMode = .date

        sender.inputView = datePickerView
        datePickerView.addTarget(self, action: #selector(self.datePickerValueChanged), for: UIControlEvents.valueChanged)
    }
}

func datePickerValueChanged(sender: UIDatePicker) {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "dd/MM/YYYY"
    self.textField.text = dateFormatter.string(from: sender.date)
}

我的customView类中的所有代码。

如果其他人遇到麻烦并需要帮助随时发表评论,我保证我会比评论该问题的人更有帮助:)

答案 1 :(得分:0)

你需要做的是将addTarget添加到Textfield,然后在方法中显示UIPickerView

self.textField.addTarget(self, action: #selector(ViewController.openDatesPicker), for: .touchDown)

您还应该为文本字段设置标记,以便稍后在代码中识别它。您还应该实现此方法,以阻止键盘显示

func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
    if textField.tag == 2 {
        return true
    } else {
        return false
    }
}