2017-04-24 2 views
0

私は現在、データベースから時刻を収集し、それを使用して他の関数が使用するための関数を返します。それは、データベースから値を収集するために、アプリケーションの別の部分に格納されているパラメータが必要です。IBAction関数の複数のパラメータ

私の問題は、IBAction関数内でこの関数を呼びたいときです。ここで

は、機能のために私のコードです:

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 

} 

そしてここでは、複数のパラメータの問題を持っている私のIBAction機能のために私のコードです:

@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) 

} 

これは私にlibc++abi.dylib: terminating with uncaught exception of type NSException (lldb)エラーになります。いくつかのテストの後、そのエラーは、IBAction関数で追加されたパラメータplace: GMSPlaceによって引き起こされたようです。どのようにこれを修正するための任意の考え?

+0

IBActionにパラメータを追加することはできません。期間。あなたのニーズに応じて、(1)送信者が呼び出されたことを示すタグプロパティ( 'Int')を使用するか、または(2)IBAction内で' GMSPlace'インスタンスを利用可能にすることです。 – dfd

答えて

4

IBActionメソッドは任意の署名を持つことができません。ここに余分なパラメータを追加することはできません。ボタンがあなたにこれを送る方法はありません(どのようにボタンがplaceなのかを知っていますか?)一般的には、このアクションを指し示すUI要素が1つしかないので(ボタンが押されたことを知っている)それを識別するために送信者にtag。すべてのビューにはちょうど整数のtagプロパティがあります。 Interface Builderまたはコードで設定できます。次に、それを読み取って送信者を識別できます。

これはさまざまなプラットフォームでの動作を説明するドキュメントのTarget Actionから始まります。一般的には、IBActionの署名がなければなりません:

@IBAction func action(_ sender: Any) 

しかし、iOSの上で、それがあってもよい:

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

テイラーMは、以下の指摘するように、あなたは(この署名を使用しても持つことができますこれはiOSの外で動作する場合は私は手を覚えていませんが、私は個人的にしかそれを使用していません)。

@IBAction func action() 

しかしそれだけです。他に許可される署名はありません。

+1

パラメータを持たない '@IBAction func doSomething()'を持つこともできます。 –

+0

Xcode 9.2/iOS 11.2では、以下のシグネチャも機能します:1) '@IBAction func doStuff(_ sender:UIButton)'、つまり、パラメータの型は実際のコントロールの型にすることができます。すべてになる。 2) '@IBAction func doStuff(送信者:Any)' - ViewControllerのConnections Inspectorで、メソッド名はdoStuffWithSender:と表示されます。 – 7stud

関連する問題