如何通过触摸解除键盘? touchesBegan不工作

时间:2016-05-08 00:50:24

标签: swift keyboard touch

根据我在这里阅读的所有内容,我应该覆盖touchesBegan()以解除键盘(在我的案例中为DatePicker)。不幸的是,触摸屏幕并不会忽略DatePicker。触摸其他UI元素(如UISteppers)可以很好地解析键盘,并且它使用了与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()
}

}

1 个答案:

答案 0 :(得分:1)

您在评论中说,您的应用中有另一个名为Set的课程。由于此类与表视图控制器位于同一模块中,因此Swift将其优先于其内置的类。

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

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