2017-08-08 5 views
0

UIViewを継承するカスタムビュークラスMyViewがあり、テキストフィールドがあります。私はViewControllerクラスのインスタンスを表すこのクラスにdelegate変数を追加しました。セレクタクラッシュとしてdelegatedクラスの関数を使用する

機能 handleDatePickerが呼び出される
class ViewController: UIViewController, UITextFieldDelegate { 

    let my_view = MyView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.my_view.delegate = self 
     self.my_view.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(self.my_view) 

     // set up constraints 
    } 

    func handleDatePicker(sender: UIDatePicker) { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd h:mm a" 
     self.my_view.time_text_field.text = "\(dateFormatter.string(from: sender.date))" 
    } 

} 

class MyView: UIView { 

    weak var delegate: ViewController! { 
     didSet { 
      self.time_text_field.delegate = self.delegate 
     } 
    } 

    lazy var time_text_field: UITextField = { 
     let text_field = UITextField() 

     let date_picker = UIDatePicker() 
     date_picker.addTarget(self, action: #selector(self.delegate.handleDatePicker(sender:)), for: .valueChanged) 
     text_field.inputView = date_picker 

     text_field.translatesAutoresizingMaskIntoConstraints = false 
     return text_field 
    }() 

    init() { 
     self.addSubview(self.time_text_field) 

     // set up constraints 
    } 

} 

、アプリのクラッシュ:このコントローラは、私がMyViewaddTargetにセレクタとして使用したい機能が含まれています。私はMyViewクラスに機能を移動するときただし、アプリがクラッシュしなくなりました:

class ViewController: UIViewController, UITextFieldDelegate { 

    let my_view = MyView() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     self.my_view.delegate = self 
     self.my_view.translatesAutoresizingMaskIntoConstraints = false 

     self.view.addSubview(self.my_view) 

     // set up constraints 
    } 

} 

class MyView: UIView { 

    weak var delegate: ViewController! { 
     didSet { 
      self.time_text_field.delegate = self.delegate 
     } 
    } 

    lazy var time_text_field: UITextField = { 
     let text_field = UITextField() 

     let date_picker = UIDatePicker() 
     date_picker.addTarget(self, action: #selector(self.handleDatePicker(sender:)), for: .valueChanged) 
     text_field.inputView = date_picker 

     text_field.translatesAutoresizingMaskIntoConstraints = false 
     return text_field 
    }() 

    init() { 
     self.addSubview(self.time_text_field) 

     // set up constraints 
    } 

    func handleDatePicker(sender: UIDatePicker) { 
     let dateFormatter = DateFormatter() 
     dateFormatter.dateFormat = "MM/dd h:mm a" 
     self.time_text_field.text = "\(dateFormatter.string(from: sender.date))" 
    } 

} 

#selectorで使用される機能が委譲クラスからアプリがクラッシュしていないのに、なぜ?ありがとう。

+0

クラッシュにコメントが何でありますか? – Alan

+0

エラースタックトレースを追加してください。アプリがクラッシュすると、スタックトレースが発生します。必要なだけ多くの情報を持っているのはいつもいいことです。 – Barns

答えて

0

問題は、私は最初のパラメータの

date_picker.addTarget(self, action: #selector(self.delegate.handleDatePicker(sender:)), for: .valueChanged) 

代わりのselfを書いていた、私はself.delegateを使用しなければならないということである。

date_picker.addTarget(self.delegate, action: #selector(self.delegate.handleDatePicker(sender:)), for: .valueChanged) 
関連する問題