2016-07-23 9 views
1

Ich versuche, programmgesteuert mehrere Tasten zu generieren. Für den Augenblick, was hier ist, was ich habe:UIButton.addTarget mit Swift 3 und lokale Funktion

for i in POIArray { 

     let newI = i.replacingOccurrences(of: "GPS30", with: "") 

     let button = UIButton(type: .custom) 
     button.setImage(UIImage(named: newI), for: .normal) 

     button.frame.size.height = 30 
     button.frame.size.width = 30 

     button.addTarget(self, action: #selector(buttonAction(texte:newI)), for: UIControlEvents.touchUpInside) 
     XIBMenu?.stackMenuIco.addArrangedSubview(button) 

    } 

und meine Funktion:

 func buttonAction(texte: String) { 
      print("Okay with \(texte)") 
     } 

Wenn ich den Parameter 'texte' entfernen, es funktioniert. Die Buttons sind gut zum Stack hinzugefügt, aber ich brauche diesen Parameter, um eine Variable zu übergeben. Ich erhalte einen Fehler Buildtime:

Argument of '#selector' does not refer to an '@objc' method, property, or initializer 

Ja danke Xcode Ich weiß, dass es nicht eine objc Methode, weil ich in schnellen bin Codierung!

Wer kennt sich aus?

+0

Mögliche Duplikat e von [Attach Parameter zu button.addTarget Aktion in Swift] (http://stackoverflow.com/questions/24814646/attach-parameter-to-button-addttarget-action-in-swift) – KTPATEL

Antwort

0

Hier müssen Sie objc_setAssociatedObject

Add-Erweiterung in Projekt verwenden: -

extension UIButton { 
private struct AssociatedKeys { 
    static var DescriptiveName = "KeyValue" 
} 

@IBInspectable var descriptiveName: String? { 
    get { 
     return objc_getAssociatedObject(self, &AssociatedKeys.DescriptiveName) as? String 
    } 
    set { 
     if let newValue = newValue { 
      objc_setAssociatedObject(
       self, 
       &AssociatedKeys.DescriptiveName, 
       newValue as NSString?, 
       objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN 
      ) 
     } 
    } 
} 
} 

Wie zu verwenden: -

//let newI = i.replacingOccurrences(of: "GPS30", with: "") 
button?.descriptiveName = "stringData" //newI use here 

Wie Parameter erhalten: -

func buttonAction(sender: UIButton!) { 
      print(sender.descriptiveName) 
} 
+0

Danke, es hat funktioniert! Obwohl ich denke, dass es ein Fehler in Swift ist, denkst du nicht? – petaire

Verwandte Themen