Swift viewdidload 中的@IB 动作函数

@IB Action function inside of viewdidload in Swift

是否可以在 viewDidLoad() 中使用 @IB Action 函数?

操作很简单 - 步进器相应地增加其他 label.text 值。但是,步进器需要使用的值取决于 return 的 url 内容 - 当然只有在 viewDidLoad() 之后才知道。

所以我认为我不能在 viewDidLoad() 之前将 IBaction 置于顶部,如果我尝试在 viewDidLoad() 中执行我的 IB 操作,我得到的错误是:

“只能声明实例方法‘IBAction’”

编辑

让我澄清一下,对于造成的混乱,我们深表歉意。我知道我需要一个插座来从中获取 UIStepper 值。我有那个:

    @IBOutlet weak var stepper: UIStepper!

然后我有一个操作也连接到同一个 UIStepper,它将相应地 increase/decrease 标签文本的值 (new_total):

@IBOutlet weak var new_total: UILabel!

@IBAction func step_up_pass(sender: AnyObject) {
    new_total.text = "\(Int(stepper.value))"
    }

但是,我想从一个值 (todays_price) 开始,我从 json 请求返回并将其用作起点,使用步进器和将相乘后的值放入标签的文本中。

我在单独的文件中有一个结构定义了我的对象,因此:

struct PassengerFromOtherBus {

var fname: String?
var lname: String?
var todays_price: Int?


init(json: NSDictionary) {
    self.fname = json["fname"] as? String
    self.lname = json["lname"] as? String
    self.todays_price = json["todays_price"] as? Int
}

}

所以稍后在视图控制器中,在 viewDidLoad() 内部,在连接到 URL 然后使用 NSJSONSerialization 和这里的一堆其他代码解析它之后(我不需要把你弄糊涂了)我终于有了我的价值 todays_price。所以我的问题是,当它只在我的 viewDidLoad() 内部已知时,我如何让我的操作使用该值? Xcode 甚至不允许我将 IBAction 连接到 viewDidLoad 函数内的任何地方!

这不是通过 Action 完成的,而是通过 Outlet 完成的。将 IB 的步进器作为插座连接到您的 ViewController。然后只需在 ViewDidLoad 中设置 Stepper 的值即可。

我绝不会直接从 UIStepper.value 转到 UILabel.text。 使用中间变量来存储值。

JSON 中的 return 执行相同的操作。通过在这些变量上设置 didSet 函数,您可以在更新任何值时更新 UI。

class FirstViewController: UIViewController {

    var todays_price: Int = 0 {
        didSet { // didSet to trigger UI update
            myLabel.text = "\(stepperValue * todays_price)"
        }
    }

    var stepperValue : Int = 1 {
        didSet { // didSet to trigger UI update
            myLabel.text = "\(stepperValue * todays_price)"
        }
    }

    @IBOutlet weak var myStepper: UIStepper!
    @IBOutlet weak var myLabel: UILabel!

    override func viewDidLoad() {
        //
        let returnValueFromJson = 10
        todays_price = returnValueFromJson

    }

    @IBAction func stepperUpdate(sender: AnyObject) {

        stepperValue = Int(myStepper.value)

    }

}

只需在视图控制器的顶部添加一个变量来保存来自 json 请求的值。然后在 viewDidLoad 中更新该变量,然后您可以使用它来设置标签和 IBAction 内部(不必在 viewDidLoad 内部)。

所以你会这样做:

class WhateverViewController: UIViewController {

    var todays_price: Int!

    override func viewDidLoad() {
        super.viewDidLoad()
        todays_price = // The value you got from json goes here
        new_total.text = "\(todays_price)"
    }

    @IBAction func step_up_pass(sender: AnyObject) {
        new_total.text = "\(Int(stepper.value) * todays_price)"
    }

}