2017-04-24 2 views
0

Ich habe derzeit eine Funktion, die eine Uhrzeit aus einer Datenbank sammelt und für andere Funktionen zurückgibt. Es benötigt einen Parameter, der in einem anderen Teil der App gespeichert wird, um den Wert aus der Datenbank zu sammeln.Mehrere Parameter für eine IBAction-Funktion

Mein Problem kommt, wenn ich diese Funktion innerhalb einer IBAction-Funktion aufrufen möchte.

Hier ist mein Code für die Funktion:

func getDBValue(place: GMSPlace) -> Int { 

    var expectedValue = 0 

    databaseRef.child("values").child(place.placeID).observe(.value, with: { (snapshot) in 
     let currentValue = snapshot.value as? [Int] 

     if currentValue == nil { 
      self.noValue() 
      expectedValue = 0 
     } else { 
      let sumValue = currentValue?.reduce(0, +) 

      let avgValue = sumValue!/(currentValue?.count)! 

      print("The current value is \(String(describing: avgValue))") 

      expectedValue = avgValue 

      self.valueLabel.text = String(describing: avgValue) 
     } 

    }) 

    print("This is the expected WT: \(expectedWaitTime)") 

    return expectedValue 

} 

Und hier ist mein Code für meine IBAction Funktion, die Probleme mit mehreren Parametern mit:

@IBAction func addValuePressed(_ sender: Any, place: GMSPlace) { 

    print("This is the place ID: \(place.placeID)") 

    var expectedValue = getDBValue(place: place) 

    expectedValue = expectedValue + 1 

    print("The expectedValue is now: \(expectedValue)") 

    self.valueLabel.text = String(describing: expectedValue) 

} 

Das gibt mir einen libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) Fehler. Nach einigen Tests scheint der Fehler durch den hinzugefügten Parameter place: GMSPlace in meiner IBAction-Funktion verursacht worden zu sein. Irgendwelche Gedanken darüber, wie das zu beheben ist?

+0

Sie können einer IBAction keine Parameter hinzufügen. Zeitraum. Die üblichen Problemumgehungen sind je nach Ihren Bedürfnissen: (1) Verwenden Sie die Tag-Eigenschaft (es ist ein "Int"), um anzugeben, welcher Absender aufgerufen wurde, oder (2) machen Sie Ihre "GMSPlace" -Instanz in der IBAction verfügbar. – dfd

Antwort

4

IBAction Methoden können keine willkürlichen Signaturen haben. Sie können hier keinen zusätzlichen Parameter hinzufügen. Es gibt keine Möglichkeit für die Schaltfläche, Ihnen dies zu senden (wie weiß die Schaltfläche, was place ist?) Im Allgemeinen wird dies entweder durch nur ein UI-Element, das auf diese Aktion verweist (also Sie wissen, welche Taste gedrückt wurde), oder mit einem tag auf dem Absender, um es zu identifizieren. Jede Ansicht hat eine Eigenschaft tag, die nur eine ganze Zahl ist. Sie können das in Interface Builder oder in Code festlegen und dann können Sie es lesen, um den Absender zu identifizieren.

Beginnen Sie mit dem Lesen von Target Action in der Dokumentation, die erklärt, wie dies auf den verschiedenen Plattformen funktioniert. Im Allgemeinen muss die Unterschrift eines IBAction sein:

@IBAction func action(_ sender: Any) 

jedoch auf iOS, kann es auch sein:

@IBAction func action(_ sender: Any, forEvent: UIEvent) 

Als Taylor M unten weist darauf hin, können Sie auch diese Signatur verwenden können (obwohl ich mich nicht direkt daran erinnern kann, wenn das außerhalb von iOS funktioniert, habe ich es nur persönlich dort benutzt).

@IBAction func action() 

Aber das ist es. Es gibt keine anderen erlaubten Signaturen.

+1

Sie können auch '@IBAction func doSomething()' ohne Parameter haben. –

+0

In Xcode 9.2/iOS 11.2 funktionieren auch die folgenden Signaturen: 1) '@IBAction func doStuff (_ sender: UIButton)', dh der Typ des Parameters kann der Typ des eigentlichen Controls sein - der Typ hat nicht Any sein. 2) '@IBAction func doStuff (sender: Any)' - Im Inspector der Connections für den ViewController wird der Methodenname als doStuffWithSender: aufgelistet. – 7stud