2016-07-06 15 views
0

Ich habe ein UIButton als Subview einer UIView-Klasse erstellt. Ich möchte diese UIView als Unteransicht zu einer UIViewController-Klasse hinzufügen. Ich möchte der UIButton eine Zielaktion in der UIViewController-Klasse hinzufügen. In meinem Beispiel unten, wenn Sie auf meine UIButton tippen, sollte "Hallo, die Taste wurde gedrückt!" Es passiert jedoch nichts. Warum ist das? Ich verstehe, dass es andere Wege gibt, dies zu erreichen. Warum funktioniert mein Weg nicht und was sind die Vor- und Nachteile, dies mit anderen Techniken zu erreichen?Muss ich Protokolle/Delegation verwenden, damit ein ViewController eine Aktion einer UIButton ausführt, die in einer anderen Klasse erstellt wurde?

import UIKit 

class ViewController: UIViewController { 

let myView = MyView() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.view.addSubview(myView) 
    myView.myButton.addTarget(self, action: #selector(hello), forControlEvents: UIControlEvents.TouchUpInside) 
} 

func hello() 
{ 
    print("Hello the button was pressed!") 
} 



} 

class MyView : UIView 
{ 
var myMainView = UIView(frame: CGRectZero) 
var myButton = UIButton(frame: CGRectZero) 

override init(frame:CGRect){ 
    super.init(frame:frame) 

    setUpViews() 
} 

required init?(coder aDecoder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func setUpViews() 
{ 
    print("Set up views") 
    myMainView.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width , UIScreen.mainScreen().bounds.height) 
    myMainView.backgroundColor = UIColor.yellowColor() 
    self.addSubview(myMainView) 

    myButton.frame = CGRectMake(100, 100, 200, 40) 
    myButton.backgroundColor = UIColor.darkGrayColor() 
    myMainView.addSubview(myButton) 
} 
} 

Antwort

0

Sie müssen myView eine Größe geben.

Like:

override func viewDidLoad() { 
    super.viewDidLoad() 

    myView.frame = view.bounds 
    self.view.addSubview(myView) 
    myView.myButton.addTarget(self, action: #selector(hello), forControlEvents: UIControlEvents.TouchUpInside) 
}