多个 UIDatePicker 一个 uitextfield

multiple UIDatePicker one uitextfield

在我的ViewController中有几个UiTextfield

我打算使用一个 UIDatePicker 预计会有相应的回应。 我的代码只响应第二个文本字段而不是第一个文本字段生成的事件。

我只需要确定哪个 UITextField 产生了事件...

import UIKit

class ViewController: UIViewController , UITextFieldDelegate {

var datePicker = UIDatePicker()

@IBOutlet weak var tvDueDate: UITextField!
@IBOutlet weak var tvOtherDate: UITextField!



override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
     //setupDatePicker()
     self.tvDueDate.tag = 0
     self.tvOtherDate.tag = 1
     //setupDatePicker(textField)
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldDidEndEditing(textField: UITextField) {
    setupDatePicker(textField)

}

func textFieldDidBeginEditing(textField: UITextField) {
    setupDatePicker(textField)

}




func setupDatePicker(text: UITextField) {
    // Sets up the "button"
    //tvDueDate.text = "Pick a due date"
    //tvDueDate.textAlignment = .Center
    // Removes the indicator of the UITextField
    //tvDueDate.tintColor = UIColor.clearColor()
    // Specifies intput type
    datePicker.datePickerMode = .Date
    // Creates the toolbar
    let toolBar = UIToolbar()
    toolBar.barStyle = .Default
    toolBar.translucent = true
    toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    toolBar.sizeToFit()

    // Adds the buttons
    var doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "doneClick")
    var spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
    var cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: "cancelClick")
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.userInteractionEnabled = true

    // Adds the toolbar to the view
    if text.tag == 0{
        self.tvDueDate.inputView = datePicker
        self.tvDueDate.inputAccessoryView = toolBar
    }
    else
    {
       self.tvOtherDate.inputView = datePicker
        self.tvOtherDate.inputAccessoryView = toolBar
    }

}

func doneClick() {
    var dateFormatter = NSDateFormatter()
    //dateFormatter.dateFormat = "dd-MM-yyyy"
    dateFormatter.dateStyle = .ShortStyle
    if tvDueDate.isFirstResponder(){
        tvDueDate.text = dateFormatter.stringFromDate(datePicker.date)
        tvDueDate.resignFirstResponder()
    }else{
      tvOtherDate.text = dateFormatter.stringFromDate(datePicker.date)
       tvOtherDate.resignFirstResponder()
    }
}

func cancelClick() {
    if tvDueDate.isFirstResponder(){
          tvDueDate.resignFirstResponder()
    }else{
         tvOtherDate.resignFirstResponder()
    }
}

}

您正在呼叫

setupDatePicker()

来自 viewDidLoad,您的代码是

if tvDueDate.isFirstResponder(){
        tvDueDate.inputView = datePicker
        tvDueDate.inputAccessoryView = toolBar
    }
    else
    {
        tvOtherDate.inputView = datePicker
        tvOtherDate.inputAccessoryView = toolBar
    }

将选择器添加为 inputAccessoryView。从 viewDidLoad 的角度来看,没有文本字段是 FirstResponder,这就是为什么只有您的其他部分很兴奋并且它只添加到 tvOtherDate 字段。 我建议从文本字段委托方法调用它(将开始编辑或 didbegineditting)或点击调用它。并检查它是从哪里调用的,还可以传递文本字段,或者您可以使用标签。

为您的 UITextField 提供独特的标签并使用 UITextField 委托。

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
     //setupDatePicker()
     self.tvDueDate.tag = 0
     self.tvOtherDate.tag = 1

 self.tvDueDate.delegate = self
 self.tvOtherDate.delegate = self
 //setupDatePicker(textField)
 }
// UITextField Delegates
 func textFieldDidBeginEditing(textField: UITextField) {
 println("TextField did begin editing method called")

if textField.tag == 0
..........
if textField.tag == 2
....
 }
 func textFieldDidEndEditing(textField: UITextField) {
 println("TextField did end editing method called")
 }
 func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
 println("TextField should begin editing method called")
 return true;
 }

将委托和标签添加到我的 UiTextField 帮助了我......

import UIKit

class ViewController: UIViewController , UITextFieldDelegate {

var datePicker = UIDatePicker()

@IBOutlet weak var tvDueDate: UITextField!
@IBOutlet weak var tvOtherDate: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    //setupDatePicker()
    self.tvDueDate.tag = 0
    self.tvOtherDate.tag = 1
    //setupDatePicker(textField)

    self.tvDueDate.delegate = self
    self.tvOtherDate.delegate = self
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func textFieldDidEndEditing(textField: UITextField) {
    setupDatePicker(textField)

}

func textFieldDidBeginEditing(textField: UITextField) {
    setupDatePicker(textField)

}

func setupDatePicker(text: UITextField) {
    // Sets up the "button"
    //tvDueDate.text = "Pick a due date"
    //tvDueDate.textAlignment = .Center
    // Removes the indicator of the UITextField
    //tvDueDate.tintColor = UIColor.clearColor()
    // Specifies intput type
    datePicker.datePickerMode = .Date
    // Creates the toolbar
    let toolBar = UIToolbar()
    toolBar.barStyle = .Default
    toolBar.translucent = true
    toolBar.tintColor = UIColor(red: 92/255, green: 216/255, blue: 255/255, alpha: 1)
    toolBar.sizeToFit()

    // Adds the buttons
    var doneButton = UIBarButtonItem(title: "Done", style: .Plain, target: self, action: "doneClick")
    var spaceButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
    var cancelButton = UIBarButtonItem(title: "Cancel", style: .Plain, target: self, action: "cancelClick")
    toolBar.setItems([cancelButton, spaceButton, doneButton], animated: false)
    toolBar.userInteractionEnabled = true

    // Adds the toolbar to the view
    if text.tag == 0{
        self.tvDueDate.inputView = datePicker
        self.tvDueDate.inputAccessoryView = toolBar
    }
    else
    {
        self.tvOtherDate.inputView = datePicker
        self.tvOtherDate.inputAccessoryView = toolBar
    }

}

func doneClick() {
    var dateFormatter = NSDateFormatter()
    //dateFormatter.dateFormat = "dd-MM-yyyy"
    dateFormatter.dateStyle = .ShortStyle
    if tvDueDate.isFirstResponder(){
        tvDueDate.text = dateFormatter.stringFromDate(datePicker.date)
        tvDueDate.resignFirstResponder()
    }else{
        tvOtherDate.text = dateFormatter.stringFromDate(datePicker.date)
        tvOtherDate.resignFirstResponder()
    }
}

func cancelClick() {
    if tvDueDate.isFirstResponder(){
        tvDueDate.resignFirstResponder()
    }else{
        tvOtherDate.resignFirstResponder()
    }
}
}