2016-04-24 4 views
0

In meinem Beispiel habe ich 3 Schaltflächen. Zwei der Schaltflächen mit derselben Verantwortungsebene und die dritte Schaltfläche haben eine Abhängigkeit von den ersten. Ich möchte, dass die 3. Taste die Methode von Taste 1 oder Taste 2 aufruft, abhängig davon, ob Taste 1 oder Taste 2 gedrückt wurde.Swift/Delivery-Methodenname zu IBAction, um Abhängigkeit zu erstellen

exampleMenu.buttnOne.addTarget(self, action: #selector(ViewController.firstBtnFunc(_:)), forControlEvents: .TouchUpInside) 
exampleMenu.buttnTwo.addTarget(self, action: #selector(ViewController.secondBtnFunc(_:)), forControlEvents: .TouchUpInside) 

Ich war wie dieses an etwas gedacht meine Bedürfnisse zu lösen:

var currentButton:String = "" 

func buttnOne(button: UIButton) { 
    currentButton = "buttnOne" 
} 

func buttnTwo(button: UIButton) { 
    currentButton = "buttnTwo" 
} 

@IBAction func thirdButtonAction(sender: AnyObject) { 

    if currentButton == "buttnOne" { 
     buttnOne() 
    } else if currentButton == "buttnTwo" { 
     buttnTwo() 
    } 
} 

Aber auf diese Weise ich den Fehler: Missing argument for parameter #1 in call

ViewController.buttnOne() Verwendung gibt mir den Fehler: Use of instance member buttnOne on type ViewController; did you mean to use a value of type ViewController instead?

Wie kann ich mein Problem lösen? Hilfe wird sehr geschätzt.

bearbeiten wie gewünscht:

enter image description here

Sie die Schnittstelle im Moment nichts dagegen. Es ist in der Beta und noch nicht fertig. Aber es gibt die Idee. Ich möchte, dass der Benutzer eine Kategorie auswählt. Wie Flüssigkeiten. Und eine Unterkategorie wie ML (Mililiter).

Die ML-Taste hat den folgenden Code:

func mlBtnFunc(button: UIButton!) { 
    var numberInt:Double = Double(numberStr)! 

    tableData = ["Mililiter", "Centiliter", "Liter", "Ounces", "Cups", "Gallons"] 
    tableCounterData = ["\(numberInt) ml", "\(numberInt * 0.1) cl", "\(numberInt * 0.01) l", "\(numberInt * 0.0338135) oz", "\(numberInt * 0.00422676) cups", "\(numberInt * 0.000264172) gallons"] 
    print(numberStr) 

    currentButton = "mlBtnFunc" 
} 

Jetzt mag ich die Taste in dem Tastaturabschnitt „go“ erneut, um die Funktion aufzurufen, der Benutzer den Wert neu zu berechnen eingegeben. Um das zu erreichen, ich nenne es jetzt wie folgt aus:

@IBAction func enterKeyboardAction(sender: AnyObject) { 

    if currentButton == "mlBtnFunc" { 
     mlBtnFunc(nil) 
    } else if currentButton == "clBtnFunc" { 
     clBtnFunc(nil) 
    } 

} 

Sie können wirklich nicht dieses bewährte Verfahren nennen, aber ich weiß nicht, wie zu sagen, die enterKeyboardAction, welche Werte haben berechnet ... Jede Beratung würde geschätzt. Aber im Moment macht die App, was ich von ihr möchte.

+0

Ich würde vorschlagen, die Berechnung der Taste Ausklammerung. Da sowohl der ML-Button als auch der Go-Button neu berechnet werden müssen, könnte man eine Funktion "neu berechnen", die sie beide aufrufen. 'readculate' könnte sich anschauen, was die aktuelle Schaltfläche ist und die richtige Neuberechnung für diese Schaltfläche durchführen. Der Code der ML-Schaltfläche wäre also nur 'currentButton =" mlBtnFunc "; readculate() ', und' enterKeyboardAction' Code wäre einfach 'requeculate()'. Zuerst wäre 'recrculate' eine große' switch' Anweisung, abhängig vom 'currentButton', obwohl ich mir überlegen kann, wie man es weiter verfeinern kann ... – matt

+0

das ist eigentlich eine gute Idee mit dem Factoring. esp, da ich 20 Werte zu berechnen habe ... danke für Ihre Zeit und Beratung –

+0

Nur um zu verdeutlichen: Was ich versuche zu tun, ist zu verhindern, dass Sie Schnittstelle (Ansicht) mit Daten (Modell) mischen. Ihr Code sagt "tue so, als ob der Nutzer erneut auf die ML-Taste geklickt hätte." Das fühlt sich falsch an, weil es nicht passiert ist; Der Benutzer tippte auf die Schaltfläche Los. Also, was ich sage, ist, wenn die ML-Taste und die Go-Taste dasselbe tun, machen Sie etwas, das sie selbst tun - anstatt so zu tun, dass eine Taste die andere Taste ist. – matt

Antwort

2

Ihre Methoden buttnOne und buttnTwo erfordern einen UIButton-Parameter, den Sie jedoch nicht angeben, wenn Sie sie aufrufen. Wenn sie manchmal einen button Parameter zu tun bekommen und manchmal nicht, können Sie sie mit einem optionalen UIButton Parameter deklarieren und nennen sie mit nil, wie folgt aus:

func buttnOne(button: UIButton!) { 
    currentButton = "buttnOne" 
} 

func buttnTwo(button: UIButton!) { 
    currentButton = "buttnTwo" 
} 

@IBAction func thirdButtonAction(sender: AnyObject) { 

    if currentButton == "buttnOne" { 
     buttnOne(nil) 
    } else if currentButton == "buttnTwo" { 
     buttnTwo(nil) 
    } 
} 
+0

danke. das hat es getan. ich kann heute nicht mehr upvote. (Grenze erreicht) Ich werde bis morgen früh. In 4 Minuten werde ich prüfen wie gelöst. Danke! –

+0

Aber das ist nur eine Notlösung; Ihre gesamte vorgeschlagene Architektur ist äußerst zweifelhaft. – matt

+0

Wenn ich besser verstehen würde, was der wirkliche Punkt war, würde ich eine völlig überarbeitete Architektur vorschlagen. – matt

Verwandte Themen