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)"
}
}
是否可以在 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)"
}
}