如何通过触摸消除键盘?触摸开始不起作用



根据我在这里读到的所有内容,我应该重写touchesBegan()以关闭键盘(在我的例子中是DatePicker)。不幸的是,触摸屏幕并不能关闭DatePicker。触摸UISteppers等其他UI元素可以很好地消除键盘,并且它使用的是CloseKeyboard()的相同功能

class RecordWorkoutTableViewController: UITableViewController, UITextFieldDelegate {
@IBOutlet weak var dateTextField: UITextField!
@IBOutlet weak var weightLabel: UILabel!
@IBOutlet weak var setOneLabel: UILabel!
@IBOutlet weak var setTwoLabel: UILabel!
@IBOutlet weak var weightStepper: UIStepper!
@IBOutlet weak var setOneStepper: UIStepper!
@IBOutlet weak var setTwoStepper: UIStepper!
var newDate: NSDate? {
    didSet {
        dateTextField.text = NSDateToPrettyString(newDate!)
    }
}
var newWeight: Int? {
    didSet {
        weightLabel.text = "(newWeight!) lbs"
    }
}
var newSetOne: Int? {
    didSet {
        setOneLabel.text = "Set 1: (newSetOne!) reps"
    }
}
var newSetTwo: Int? {
    didSet {
        setTwoLabel.text = "Set 2: (newSetTwo!) reps"
    }
}
var workout: Workout?
//  MARK: UITextFieldDelegate
func textFieldDidBeginEditing(textField: UITextField) {
    let datePicker = UIDatePicker()
    textField.inputView = datePicker
    datePicker.addTarget(self, action: #selector(RecordWorkoutTableViewController.datePickerChanged(_:)), forControlEvents: .ValueChanged)
}
func datePickerChanged(sender: UIDatePicker) {
    newDate = sender.date
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
    textField.resignFirstResponder()
    return true
}
// disable editing of date text.  datepicker input only
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    return false
}
// MARK: Helper Functions
func closeKeyboard() {
    self.view.endEditing(true)
}
// MARK: Touch Events

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    closeKeyboard()
}

override func viewDidLoad() {
    super.viewDidLoad()
    dateTextField.delegate = self
    newDate = NSDate()
    if let lastWorkout = workout {
        newWeight = lastWorkout.sets[0].weight
        newSetOne = lastWorkout.sets[0].repCount
        newSetTwo = lastWorkout.sets[1].repCount
    } else {
        newWeight = 0
        newSetOne = 9
        newSetTwo = 8
    }
    weightStepper.stepValue = 5
    weightStepper.maximumValue = 995
    weightStepper.value = Double(newWeight!)
    setOneStepper.stepValue = 1
    setOneStepper.maximumValue = 20
    setOneStepper.value = Double(newSetOne!)
    setTwoStepper.stepValue = 1
    setTwoStepper.maximumValue = 20
    setTwoStepper.value = Double(newSetTwo!)
}
@IBAction func weightStepperChanged(sender: UIStepper) {
    newWeight = Int(sender.value)
    closeKeyboard()
}
@IBAction func setOneStepperChanged(sender: UIStepper) {
    newSetOne = Int(sender.value)
    closeKeyboard()
}
@IBAction func setTwoStepperChanged(sender: UIStepper) {
    newSetTwo = Int(sender.value)
    closeKeyboard()
}

}

您在评论中说您的应用程序中有另一个名为Set的类。由于这个类和您的表视图控制器在同一个模块中,Swift将它的优先级设置在内置类之上。

您可以通过重命名Set类或在函数声明中显式指定Swift模块来解决此问题:

override func touchesBegan(touches: Swift.Set<UITouch>, withEvent event: UIEvent?) {
    closeKeyboard()
}

最新更新