Ich entwickle gerade iOS App mit Swift. Ich habe eine angepasste UIView implementiert, die einem ViewController addSubview-ed ist, und es gibt eine Delegate-Methode in ViewController, die von einer UIButton in der angepassten UIView aufgerufen wird.Wie kann ich Delegate-Methode in der richtigen Weise implementieren?
Als ich die Delegate-Methode, wie es direkt von CustomView aufgerufen wird, implementiert, erhalte ich einen Fehler, der sagt "unerkannter Selektor an Instanz xxxx gesendet". Ich denke, es gibt ein Problem mit der Speicherkapazität.
SampleViewController
class SampleViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let customView = CustomView(frame: CGRectMake(0, 0, self.view.frame.width, self.view.frame.height))
self.view.addSubview(customView)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func sampleFunc() {
print("sampleFunc")
}
}
Custom
class CustomView: UIView {
let button = UIButton(frame: CGRectZero)
func setup() {
button.addTarget(self, action: #selector(SampleViewController.sampleFunc(_:)), forControlEvents: .TouchUpInside)
self.addSubview(button)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
//
}
}
Aber auf der anderen Seite, wenn ich die Methode in der Art und Weise implementieren sie von Custom indirekt wie unten genannt, es funktionierte, als ich gedacht.
Custom (Modified)
class CustomView: UIView {
let button = UIButton(frame: CGRectZero)
func setup() {
button.addTarget(self, action: #selector(CustomView.buttonAction(_:)), forControlEvents: .TouchUpInside)
self.addSubview(button)
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
// 略
}
@objc private func buttonAction(sender: AnyObject) {
UIApplication.sharedApplication().sendAction(#selector(SampleViewController.sampleFunc(_:)), to: nil, from: self, forEvent: nil)
}
}
Das Problem ist, ich nicht, warum es richtig funktioniert, wenn ich die Methode in der Art und Weise implementieren sie indirekt genannt wird. Ich schätze all die Hilfe. Vielen Dank!
Danke, @C_X! Ich habe die addTarget-Methode wie unten beschrieben geändert und es sieht gut aus. Ist es das, was du meintest? 'button.addTarget (SampleViewController(), Aktion: #selector (SampleViewController.sampleFunc (_ :)), forControlEvents: .TouchUpInside)' – Dave
Wenn Sie möchten, dass diese Aktionsmethode in View-Controller aufgerufen werden soll, müssen Sie übergeben Zeige Controller-Objekt anstelle von self in addTargetMethod –