2016-04-16 24 views
0

次のコードがあり、doneButtonハンドラは呼び出されません。どんな考えが間違っているのでしょうか?addTargetがイベントを発生させない

私は、セレクタに多くの異なるフォーマットを試しましたが、パラメータの有無もあります。また、UIViewが手動でuserInteractionEnabled = trueを設定してタッチイベントを受信したことを確認しました。事前に助けてくれてありがとう!

*** UPDATE:私はコードを完全にリファクタリングが、しているが、同じ行動:

マイプロトコル:

import Foundation 

protocol CustomDatePickerDelegate { 
    func dataPickerDone(date: NSDate) 
    func dataPickerChanged(date: NSDate) 
} 

私のクラス:

import Foundation 
import UIKit 

class CustomDatePicker{ 

var delegate: CustomDatePickerDelegate? 
var datePicker : UIDatePicker = UIDatePicker() 

func CreateDatePicker(sender: UITextField) { 

    if (delegate is UIViewController) 
    { 
     let _self = delegate as! UIViewController 

     let _view = UIView(frame: CGRectMake(0, 0, _self.view.frame.width, 220)) 

     let datePickerView : UIDatePicker = UIDatePicker(frame: CGRectMake(0, 40, 0, 0)) 
     datePickerView.datePickerMode = UIDatePickerMode.Date 


     let _toolbar = UIToolbar() 
     let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: self, action: #selector(CustomDatePicker.doneButton)) 
     _toolbar.translucent = false 
     _toolbar.sizeToFit() 

     _doneButton.accessibilityLabel = "DoneToolbar" 
     let _spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.FlexibleSpace, target: nil, action: nil) 


     _toolbar.setItems([_spaceButton, _doneButton], animated: false) 
     _toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(self, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

     _view.addSubview(datePickerView) 
     _view.addSubview(_toolbar) 

     sender.inputView = _view 
    } 
} 

@objc func handleDatePicker(sender:UIDatePicker) { 
    delegate?.dataPickerChanged(datePicker.date) 
} 

@objc func doneButton(){ 
    delegate?.dataPickerDone(datePicker.date) 
} 

}

方法私はViewControllerからそれを使用します:

let _dataPicker : CustomDatePicker = CustomDatePicker() 
    _dataPicker.delegate = self 
    _dataPicker.CreateDatePicker(dataUI) 

func dataPickerDone(date: NSDate) { 
    dataUI.text = DataFormatejada(date) 
    dataUI.resignFirstResponder() 
} 

func dataPickerChanged(date: NSDate) { 
    dataUI.text = DataFormatejada(date) 
} 
+0

これは、 'UITateFick'にサブビューとして' UIDatePicker'を追加した結果と考えられます。また、問題を引き起こすことはありませんが、これがすべてのクラスであれば、メソッドが 'MyDatePicker'のインスタンスではなく別のビューに日付を追加するように見えるので、UIViewのサブクラスではありません。階層? –

+0

私の問題は解決しなかった、とにかく感謝! – Batiatto

+0

ええと、私はあなたの日付ピッカーが期待どおりに画面に表示されていると仮定し、それを操作して日付を変更できますか? –

答えて

0

数時間の試行錯誤の後に問題を解決する方法が見つかりました。問題は、ターゲットである:自己ラインで参照:

var instance : CustomDatePicker? 

let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: self, action: #selector(CustomDatePicker.doneButton)) 

_toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(self, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

はそう私が行っていることはMyDatePickerクラスの新しいプロパティを作成することです

これらのaddTargetメソッドを次のように変更します。

let _doneButton = UIBarButtonItem(title: "DONE", style: UIBarButtonItemStyle.Done, target: instance, action: #selector(CustomDatePicker.doneButton)) 
_toolbar.userInteractionEnabled = true 
        datePickerView.addTarget(instance, action: #selector(CustomDatePicker.handleDatePicker), forControlEvents: UIControlEvents.ValueChanged) 

と私はとしてのViewControllerからそれを使用します。

let _dataPicker : CustomDatePicker = CustomDatePicker() 
    _dataPicker.delegate = self <---- **this made the trick** 
    _dataPicker.instance = _dataPicker 
    _dataPicker.CreateDatePicker(dataUI) 

が、これはエレガントではありません、それは、より根本的な問題のためのパッチです。なぜ自己はオブジェクトのインスタンスを提供していないので、オブジェクトを作成するときに手動で戻す必要がありますか?

ありがとうございました!

関連する問題