2015-05-13 17 views
7

Wie kann ich eine String-Eigenschaft mit einer UIButton in Swift verknüpfen? Ich möchte nicht, dass die Zeichenfolge als Schaltflächentext angezeigt wird, sondern einfach der Schaltfläche als Bezeichner oder Schlüssel zugewiesen wird. Hier ist, was ich bisher:Hinzufügen einer Zeichenfolgeneigenschaft zu einer UIButton in Swift

func createAnswerButtons() { 

    var index:Int 
    for index = 0; index < self.currentQuestion?.answers.count; index++ { 

     // Create an answer button view 
     var answer:AnswerButtonView = AnswerButtonView() 
     selection.setTranslatesAutoresizingMaskIntoConstraints(false) 

     // Place into content view 
     self.scrollViewContentView.addSubview(answer) 

     // Add a tapped gesture recognizer to the button 
     let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: Selector("answerTapped:")) 
     answer.addGestureRecognizer(tapGesture) 

     // Add constraints etc 

     // Set the answer button text 
     let answerText = self.currentQuestion!.answers[index] 
     answer.setAnswerText(answerText) 

     // Set the identifier for each answer button 
     self.identifier = self.currentQuestion!.answerIdentifier[index] 

     // Add to the selection button array 
     self.answerButtonArray.append(answer) 
} 

Also ich denke, ich brauche etwas nach

// Set the identifier for each answer 
     self.identifier = self.currentQuestion!.answerIdentifier[index] 

die Kennung der Taste zuweisen.

Der Grund dafür ist, ich versuche, eine Entscheidungsbaumlogik zu implementieren, so dass ich jeden Antwortknopf verfolgen kann, der angezapft wird, um eine Codefolge zu erzeugen, die einem Endergebnis entspricht.

+1

Warum verwenden Sie nicht die Eigenschaft Tag? –

+0

@LeonardoSavioDabus Das Tag ist keine Zeichenfolge. Es ist ein 'NSInteger'. – nhgrif

+0

@nhgrif Ich weiß, dass, wenn er den Text nicht anzeigt, sehe ich keine Notwendigkeit für eine Zeichenfolge –

Antwort

8

Sie können UIButton ableiten und eine Variable buttonIdentifier hinzufügen.

class IdentifiedButton: UIButton { 
    var buttonIdentifier: String? 
} 
+2

... und dann immer daran denken, diese Unterklasse anstelle von 'UIButton' überall in Ihren IB-Dateien und so zu verwenden. – nhgrif

+0

Könntest du ein bisschen mehr Infos dazu liefern, da ich total feststecke! – brad88

+0

Ich habe keine UIButton, da ich die Schaltflächenansichten programmgesteuert erstellt habe. Ich habe eine Klasse namens AnswerButtonView erstellt und jetzt im View-Controller erzeuge ich die Button-Ansichten – brad88

9

Mit der Objective-C-Laufzeit, können wir Eigenschaften Klassen zur Laufzeit hinzufügen:

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

    @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?, 
        UInt(OBJC_ASSOCIATION_RETAIN_NONATOMIC) 
       ) 
      } 
     } 
    } 
} 

Hinzufügen @IBInspectable lässt uns auch die descriptiveName Eigenschaft durch Interface Builder gesetzt.

Für mehr über die Objective-C Laufzeit, empfehle ich Sie this NSHipster article.

+0

Dies ist eine großartige Lösung, aber es ist ziemlich hacky und ehrlich OP benötigt nicht alle 'UIButton'-Instanzen, um diese Eigenschaft einzuschließen. Upboated sowieso. – Schemetrical

+1

Ich liebe es, von Autokorrektur aufgeputscht zu werden. – nhgrif

5

Sie können accessibilityIdentifier Eigenschaft von UIButton verwenden.

0

Sie können ein Array mit den Strings erstellen, die mit der Schaltfläche verknüpft werden sollen. Setzen Sie das buttons-Tag dann auf den Index der Zeichenfolge, die mit der Schaltfläche verknüpft werden soll. Daraus folgt:

var myStrings = ["First","Second","Third"] 

button.tag = //insert a number corresponding to the string index in myStrings that you want for the button 

func buttonPressed(sender: UIButton){ 
    var selectedString = myString[sender.tag] 
} 
2

Verwenden

button.accessibilityIdentifier = "some text" 

istead von Tag.

Verwandte Themen