2016-09-21 5 views
33

hier ist mein button Objektwie Fehler addTarget Methode in schnellen 3

let loginRegisterButton:UIButton = { 
    let button = UIButton(type: .system) 
    button.backgroundColor = UIColor(r: 50 , g: 80, b: 130) 
    button.setTitle("Register", for: .normal) 
    button.translatesAutoresizingMaskIntoConstraints = false 
    button.setTitleColor(.white, for: .normal) 
    button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside) 
    return button 
}() 

und hier ist meine Funktion

func handleRegister(){ 

    FIRAuth.auth()?.createUser(withEmail: email, password: password,completion: { (user, error) in 

     if error != nil 
     { print("Error Occured")} 

     else 
     {print("Successfully Authenticated")} 
    })   
} 

Ich erhalte kompilieren zu verwenden, wenn addTarget entfernt es erfolgreich

kompiliert
+0

Versuchen Sie, diese 'button.addTarget (self, Aktion: #selector (handleRegister()), für: .touchUpInside)'. – VRAwesome

+0

'HandleRegister' Aktion sind in der gleichen Steuerung? Außerdem haben Sie nicht den Rahmen von 'UIButton' festgelegt. –

+0

Ja, ich habe eine andere Funktion für die Integritätsbedingungen func constraints() {loginRegisterButton.centerXAnchor.constraint (equalTo: inputview.centerXAnchor) .isActive = true loginRegisterButton.topAnchor.constraint (equalTo: inputview.bottomAnchor, constant: 12) .isActive = true loginRegisterButton.widthAnchor.constraint (EqualTo: inputview.widthAnchor) .isActive = true loginRegisterButton.heightAnchor.constraint (equalToConstant: 30) .isActive = true} – Ninja13

Antwort

61

Ja, fügen Sie nicht "()", wenn es keine param

button.addTarget(self, action:#selector(handleRegister), for: .touchUpInside). 

und wenn Sie möchten, um den Absender erhalten

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside). 

func handleRegister(sender: UIButton){ 
    //... 
} 

Edit:

button.addTarget(self, action:#selector(handleRegister(_:)), for: .touchUpInside) 

nicht mehr funktioniert, müssen Sie den Wähler mit einem Variablennamen ersetzen _ in Sie im Funktionskopf verwendet wird, in diesem Fall wäre es sender sein, so dass der Arbeits Code wird:

button.addTarget(self, action:#selector(handleRegister(sender:)), for: .touchUpInside) 
+0

ok das ist wirklich einfach ..aber wie fügen Sie ein Wert Beispiel .. 'button.addTarget (self, action: #selector (handleRegister (str:" Hallo ")), für: .touchUpInside)' ? – marlonpya

+0

Sie können Parameter in einem Selektor nicht einstellen. Die Aktion hängt von der Herkunft des Ziels ab. Wenn Sie die Zeichenfolge der Schaltfläche abrufen möchten, rufen Sie sie vom Absender in handleRegister (sender: UIButton) ab. let string = sender. currentTitle –

+0

Eine der Problemumgehungen besteht darin, den Parameter als barrierefreies Element festzulegen. Aber ich bin nicht sicher, ob dies vom App Store akzeptiert wird, da ich nur für Enterprise-Apps versucht habe. –

2

In swift 3 Nutzung dieser -

object?.addTarget(objectWhichHasMethod, action: #selector(classWhichHasMethod.yourMethod), for: someUIControlEvents) 

Zum Beispiel (aus meinem Code) -

self.datePicker?.addTarget(self, action:#selector(InfoTableViewCell.datePickerValueChanged), for: .valueChanged) 

Nur ein : nach Methodennamen geben, wenn Sie das wollen Absender als Parameter.

0

Der zweite Kommentar des Posters vom 21. September ist genau richtig. Für diejenigen, die später mit dem gleichen Problem wie das Poster zu diesem Thema kommen, hier eine kurze Erklärung. Die anderen Antworten sind gut zu beachten, aber behandeln Sie nicht das allgemeine Problem, auf das dieser Code stößt.

In Swift sind die mit dem Schlüsselwort let abgegebenen Deklarationen Konstanten. Natürlich, wenn Sie Elemente zu einem Array hinzufügen, kann das Array nicht als eine Konstante deklariert werden, aber ein segmentiertes Steuerelement sollte in Ordnung sein, oder ?! Nicht, wenn Sie das abgeschlossene segmentierte Steuerelement in seiner Deklaration referenzieren.

Referenzierung das Objekt (in diesem Fall ein UISegmentedControl, aber dies geschieht auch mit UIButton) in seiner Erklärung, wenn Sie .addTarget sagen und das Ziel self, Dinge Absturz sein lassen. Warum? Denn self wird gerade definiert. Aber wir wollen Verhalten als Teil des Objekts definieren ... Deklarieren Sie es träge als eine Variable mit var. Die lazy Idioten den Compiler zu denken, dass self gut definiert ist - es zum Schweigen bringt Ihren Compiler von der Pflege zum Zeitpunkt der Deklaration. Lazy deklarierte Variablen werden erst beim ersten Aufruf gesetzt.So in dieser Situation lazy können Sie den Begriff des self ohne Probleme verwenden, während Sie das Objekt einrichten, und dann, wenn das Objekt bekommt ein .touchUpInside oder .valueChanged oder was auch immer Ihr drittes Argument ist in Ihrem .addTarget(), DANN es fordert die Vorstellung von self, die zu diesem Zeitpunkt vollständig eingerichtet und vollständig vorbereitet ist, um ein gültiges Ziel zu sein. So können Sie faul sein, Ihre Variable zu deklarieren. In Fällen wie diesen denke ich, könnten sie uns ein Schlüsselwort wie necessary geben, aber es wird im Allgemeinen als eine faule, schlampige Übung angesehen und du möchtest es nicht überall im Code verwenden, obwohl es seinen Platz in dieser Art haben könnte der Situation. Was es ist

Es gibt keine lazy let in Swift (keine lazy für Konstanten).

Hier ist die Apple documentation on lazy.

Hier ist die Apple on variables and constants. Es gibt ein wenig mehr in ihrer Sprachreferenz unter Declarations.

1

Versuchen Sie dies mit Swift 3

button.addTarget(self, action:#selector(ClassName.handleRegister(sender:)), for: .touchUpInside) 

Viel Glück!

6

Versuchen mit schnellen 3

cell.TaxToolTips.tag = indexPath.row 
     cell.TaxToolTips.addTarget(self, action: #selector(InheritanceTaxViewController.displayToolTipDetails(_:)), for:.touchUpInside) 


func displayToolTipDetails(_ sender : UIButton) { 
     print(sender.tag) 
     let tooltipString = TaxToolTipsArray[sender.tag] 
     self.displayMyAlertMessage(userMessage: tooltipString, status: 202)  
} 
4
let button: UIButton = UIButton() 
    button.setImage(UIImage(named:"imagename"), for: .normal) 
    button.addTarget(self, action:#selector(YourClassName.backAction(_sender:)), for: .touchUpInside) 

    button.frame = CGRect.init(x: 5, y: 100, width: 45, height: 45) 
    view.addSubview(button) 

    public func backAction(_sender: UIButton) { 

    } 
0

Statt

let loginRegisterButton:UIButton = { 
//... }() 

Versuchen:

lazy var loginRegisterButton:UIButton = { 
//... }() 

, dass der Compiler-Fehler beheben sollte !!!

3

Versuchen Sie dies mit Swift 4

buttonSection.addTarget(self, action: #selector(actionWithParam(_:)), for: .touchUpInside) 
func actionWithParam(sender: UIButton){ 
    //... 
} 

buttonSection.addTarget(self, action: #selector(actionWithoutParam), for: .touchUpInside) 
func actionWithoutParam(){ 
    //... 
}