2016-05-08 1 views
0

Согласно всем, что я читал здесь, я должен переопределить touchesBegan(), чтобы убрать клавиатуру (в моем случае DatePicker). К сожалению, касание экрана не отменяет DatePicker. Прикосновение других элементов пользовательского интерфейса, как и UISteppers увольняет клавиатуру просто отлично, и она использует ту же функцию CloseKeyboard()Как отменить клавиатуру с прикосновением? touchsBegan not workig

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() 
} 

}

+0

Вы случайно, что еще один класс с именем «Set» в вашем приложении? – NobodyNada

+0

я! который исправил ошибку, поэтому я строю, но прикосновение к экрану по-прежнему не скрывает DatePicker. по крайней мере, это дало мне отправную точку. благодаря – briancl

ответ

1

Вы сказали в комментариях, что у вас есть еще один класс в приложении под названием Set. Поскольку этот класс находится в том же модуле, что и ваш контроллер табличного представления, Swift уделяет первостепенное внимание его встроенному классу.

Вы можете исправить это, либо переименовании Set класса, или явного указания Swift модуля в объявлении функции:

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