2017-08-08 53 views
0

我有一個自定義視圖類MyView,它繼承自UIView,它包含一個文本字段。我爲這個類添加了一個delegate變量,它代表了我的ViewController類的一個實例。該控制器包含我想在addTarget作爲選擇使用內部MyView功能:Swift使用委託類的功能作爲選擇器崩潰

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 
    } 

} 

當函數handleDatePicker被調用,應用程序崩潰。然而,當我移動功能爲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)