【问题标题】:@IB Action function inside of viewdidload in SwiftSwift 中 viewdidload 中的 @IB Action 函数
【发布时间】:2015-11-09 01:37:35
【问题描述】:

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

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

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

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 和这里的一堆其他代码(我不需要混淆你)解析它之后,我终于今天的价格有我的价值。所以我的问题是,当它只在我的 viewDidLoad() 内部知道时,如何让我的操作使用该值? Xcode 甚至不允许我将 IBAction 连接到 viewDidLoad 函数内的任何位置!

【问题讨论】:

  • 发布您的代码。目前还不清楚你的问题是什么
  • 您的问题实际上是:我正在异步获取数据,需要时间才能完成。当它完成时,我的视图已经加载。如何及时获取我的数据,这样我就不必在 UI 可见时更新它?
  • 嗯,我想你可以这样说,是的
  • 好的,我明天贴代码

标签: ios swift ibaction viewdidload


【解决方案1】:

这不是通过 Action 而是通过 Outlet 完成的。将 IB 中的 Stepper 作为 Outlet 连接到您的 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)

    }

}

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不客气!然后点击勾选接受我的回答,这是我在这里做的第一个有用的事情,哈哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多