2016-04-15 9 views
0

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!

Antwort

1
button.addTarget(self, action: #selector(SampleViewController.sampleFunc(_:)), forControlEvents: .TouchUpInside) 

Diese Linie bedeutet, wenn Sie auf die Schaltfläche tippen Sie auf self (CustomView) und self (CustomView) bieten keine Implementierung von sampleFunc, suchen und ausführen Methode sollten Sie in zweiten Fall haben dort Verfahren implementiert und seine funktioniert gut, . Pass viewController Objekt anstelle von self in addTarget Methode.

Sie können viewController object als Parameter in init Methode übergeben und dann in Setup-Methode diese Methode verwenden.

+0

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

+1

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 –

Verwandte Themen