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()
但仅此而已。没有其他允许的签名。
我目前有一个从数据库中收集时间的函数,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()
但仅此而已。没有其他允许的签名。