Swift

时间:2015-11-09 01:37:36

标签: ios swift ibaction viewdidload

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

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

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

"只有实例方法可以声明'IBAction' “

修改

让我澄清一下,抱歉这是混乱。我知道我需要一个插座来获取UIStepper值。我有:

    @IBOutlet weak var stepper: UIStepper!

然后我还有一个连接到同一个UIStepper的动作,它会相应地增加/减少标签文本(new_total)的值:

@IBOutlet weak var new_total: UILabel!

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

但是,我想从一个值(todays_price)开始我从json请求中获取并使用它作为起点,使用步进器将其相乘并将乘积值放入标签中&# 39; s文本。

我在一个单独的文件中有一个结构,用于定义我的对象:

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函数内的任何位置!

2 个答案:

答案 0 :(得分:5)

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

enter image description here

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

JSON的回复做同样的事情。通过在这些变量上设置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)

    }

}

答案 1 :(得分:1)

只需将一个变量添加到视图控制器的顶部即可保存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)"
    }

}