是否可以在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函数内的任何位置!
答案 0 :(得分:5)
这不是使用Action而是使用Outlet完成的。将IB作为插座的步进器连接到ViewController。然后只需在ViewDidLoad中设置Stepper的值。
我永远不会直接从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)"
}
}