2015-11-09 6 views
1

Возможно ли иметь функцию @IB Action внутри viewDidLoad()?@IB Функция действия внутри viewdidload в Swift

Действие является простым: Stepper, который увеличивает другие значения label.text соответственно. Однако значения, с которыми должен работать шагомер, зависят от возвращаемого содержимого URL-адреса, которые известны только после viewDidLoad(), конечно.

Так что я думаю, что я не могу иметь IBAction путь сверху до viewDidLoad(), и ошибка я получаю, если я пытаюсь сделать мое IB действие внутри viewDidLoad() является:

«только методы экземпляра могут быть объявлены" 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 и использую это как отправную точку, чтобы умножить его с помощью шага и поместить умноженное значение в текст метки.

У меня есть структуры в отдельном файле, который определяет мой объект так:

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

разместить свой код. Непонятно, какова ваша проблема –

+0

Действительно ли ваш вопрос: я собираю данные асинхронно, и для завершения требуется время. Когда он завершит мой просмотр, он уже загружен. Как получить мои данные вовремя, поэтому мне не придется обновлять свой интерфейс, если он уже виден? –

+0

Ну, я думаю, вы можете так выразиться, да –

ответ

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)" 
    } 

} 
+0

Это сработало красиво - Спасибо миллион –

+0

Добро пожаловать! Нажмите на галочку, чтобы принять мой ответ, это первая полезная вещь, которую я здесь сделал, ха-ха. – dbmrq

5

Это не действие с действием, а с выходом. Подключите Stepper от IB как выход к вашему ViewController. Затем просто установите значения Stepper в ViewDidLoad.

enter image description here

Я никогда бы не идти непосредственно из UIStepper.value в UILabel.text. Используйте промежуточную переменную для сохранения значения.

Сделайте то же самое для возврата от JSON. Установив функцию didSet на эти переменные, вы можете обновить интерфейс, когда какое-либо из значений будет обновлено.

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) 

    } 

} 
Смежные вопросы