IBAction 函数的多个参数

Multiple Parameters on an IBAction Function

我目前有一个从数据库中收集时间的函数,returns它供其他函数使用。它需要一个参数,该参数存储在应用程序的另一部分,以便从数据库中收集值。

当我想在 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 引起的。关于如何解决这个问题有什么想法吗?

IBAction 方法不能有任意签名。您不能在此处添加额外的参数。按钮无法向您发送此信息(按钮如何知道 place 是什么?)通常,这是通过只有一个 UI 元素指向此操作来处理的(所以您知道什么按钮被按下),或在发件人上使用 tag 来识别它。每个视图都有一个 tag 属性,它只是一个整数。您可以在 Interface Builder 或代码中设置它,然后您可以读取它来识别发件人。

首先阅读文档中的 Target Action,其中解释了它在各种平台上的工作原理。一般来说,IBAction 的签名必须是:

@IBAction func action(_ sender: Any)

但是,在 iOS 上,也可能是:

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

正如 Taylor M 在下面指出的那样,您也可以使用这个签名(尽管我不记得它是否在 iOS 之外工作;我个人只在那里使用过)。

@IBAction func action()

但仅此而已。没有其他允许的签名。