2016-05-08 7 views
0

私がここで読んだことすべてによると、touchesBegan()を無効にしてキーボード(私の場合はDatePicker)を無効にする必要があります。残念ながら画面に触れても、DatePickerは終了しません。 )うまくキーボードを閉じると、それはCloseKeyboard(の同じ機能を使用しているタッチでキーボードを却下するにはどうすればよいですか? touchesBegan 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

アプリで「セット」という名前の別のクラスを持つことが起こるのか? – NobodyNada

+0

私はそうです!エラーを修正したのでビルドしましたが、画面に触れてもDatePickerは隠されません。少なくともこれは私に出発点を与えた。ありがとう – briancl

答えて

1

をUISteppersのような他のUI要素を触るあなたはという名前のアプリで別のクラスを持っているコメントで言いましたSet。このクラスはテーブルビューコントローラと同じモジュールになっているため、Swiftはクラスに組み込まれている以上に優先します。

あなたはどちらかあなたのSetクラスの名前を変更、または明示的に関数宣言でSwiftモジュールを指定することによってこの問題を解決することができます

override func touchesBegan(touches: Swift.Set<UITouch>, withEvent event: UIEvent?) { 
    closeKeyboard() 
} 
関連する問題