【问题标题】:Multiple Parameters on an IBAction FunctionIBAction 函数的多个参数
【发布时间】:2017-04-24 14:25:24
【问题描述】:

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

当我想在 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。时期。根据您的需要,通常的解决方法是 (1) 使用 tag 属性(它是 Int)来指示调用了哪个发件人,或者 (2) 使您的 GMSPlace 实例在 IBAction 中可用。

标签: swift parameters ibaction


【解决方案1】:

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

但就是这样。没有其他允许的签名。

【讨论】:

  • 您也可以拥有不带参数的@IBAction func doSomething()
  • 在 Xcode 9.2/iOS 11.2 中,以下签名也有效: 1) @IBAction func doStuff(_ sender: UIButton),即参数的类型可以是实际控件的类型——类型不一定是任何。 2) @IBAction func doStuff(sender: Any) -- 在 ViewController 的 Connections Inspector 中,方法名称将被列为 doStuffWithSender:.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多