Swift使用委托类的功能作为选择器崩溃

问题描述:

我有一个自定义视图类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

的问题是,我在写

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)