2017-01-25 7 views
1

Ich habe eine 2 Klassen, wo ich uistackviews von einer Klasse an andere übergeben. Ich möchte, dass die Steuerelemente in demselben stackview erstellt werden. Daher übergebe ich die Ansicht in allen Parametern der Renderfunktion. Ich möchte auch, dass Ansicht mit der Aktion übergeben werden #selector von uibuttonPass benutzerdefinierte Parameter zu uibutton #Selektor swift 3

Klasse 1:

class ViewController: UIViewController {  
    func createbutton(parentview: UIStackView) { 
    let buttn = UIButton() 
    buttn.backgroundColor = .gray 
    buttn.setTitle("testttt", for: .normal) 
    buttn.frame.size.height = 30 
    buttn.frame.size.width = 40 
    buttn.addTarget(self, action: #selector(anotherbutton(parentview:)), for: .touchUpInside) 
    parentview.addArrangedSubview(buttn) 
    } 

    func anotherbutton(parentview: UIStackView) { 
    //another button here 
    }  

    func loadpage() { 
    print("loadpage") 
    } 
} 

Klasse 2:

class plugin : UIViewController {  

let vw = ViewController() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    let parentview = getparentnode() 
    vw.createbutton(parentview: parentview) 
} 

func getparentnode() -> UIStackView { 
    let parentnode = UIStackView() 
    parentnode.axis = UILayoutConstraintAxis.vertical 
    parentnode.distribution = UIStackViewDistribution.equalSpacing 
    parentnode.alignment = UIStackViewAlignment.center 
    parentnode.spacing = 16.0 
    parentnode.tag = 50 
    parentnode.translatesAutoresizingMaskIntoConstraints = false; 

    self.view.addSubview(parentnode) 
    //Constraints 
    parentnode.centerXAnchor.constraint(equalTo: self.view.centerXAnchor).isActive = true 
    parentnode.centerYAnchor.constraint(equalTo: self.view.centerYAnchor).isActive = true 
    return parentnode 
} 
} 

aber dies wirft einen Fehler unrecognized selector sent to instance 0x7b25e010'

So übergeben Sie die UIView in Aktion Wahlparameter? Danke für jede Hilfe

+0

Sie können das nicht tun. –

Antwort

1

Sie können nicht. Die einzigen Dinge, die Sie über eine Auswahl passieren können, sind:

  1. Nichts
  2. Das Objekt selbst (in diesem Fall der Taste)

Diese Szenarien würden wie folgt aussehen:

button.addTarget(self, action: #selector(myFunc), ...) //no parameters 

oder

button.addTarget(self, action: #selector(myFunc(_:)) //passes itself (the button) 

Wenn Sie den Wert einer Ansicht an einen anderen ViewController übergeben möchten, empfehle ich die Methode prepareForSegue. So sollten Sie Daten von ViewController an ViewController übergeben.

In Bezug auf den Rest Ihres Codes, glaube ich, dass Sie das MVC-Entwurfsmuster brechen, indem Sie eine Instanz Ihrer Klasse in einer anderen Klasse erstellen (diese Zeile: let vw = ViewController()). Zunächst einmal wird dadurch eine völlig neue Instanz erstellt, wenn Ihr ViewController nicht mit dem auf Ihrem Gerät ausgeführten identisch ist. Zweitens ist das eine schlechte Praxis. Sie sollten jedem viewController erlauben, sich selbst zu verwalten und keine externen Interferenzen von anderen ViewControllern zu haben. Die Verwendung von prepareForSegue ist ein Beispiel für die effektive Verwendung des MVC-Entwurfsmusters.

Hoffe das half.

Verwandte Themen