如何在事件发生时调用特定的ViewController?

时间:2018-02-16 01:25:29

标签: ios swift

只需要一个友好的建议。假设您有3个viewcontrollers:

ViewController A ViewController B ViewController C

在ViewController A中,您有一个按钮和标签。标签具有默认文本0.当您单击按钮时,它将为标签添加1为1,然后为2然后为3,依此类推。当它达到10时,它将以模态方式调用ViewController C.我读到你可能需要使用willSet或didSet,我是否正确?有关此事的任何建议?感谢。

2 个答案:

答案 0 :(得分:1)

一个选项是在更新值后手动更新标签:

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    var value = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        updateLabel()
    }

    @IBAction func didTapButton(_ sender: Any) {
        value += 1

        updateLabel()
    }

    private func updateLabel() {
        label.text = "\(value)"

        if value >= 10 {
            let controller = storyboard!.instantiateViewController(withIdentifier: "NextViewController")
            present(controller, animated: true)
        }
    }
}

注意,我努力在“模型”(value)和“视图”(@IBOutlet)之间保持清晰的分离。

但你问:

  

我知道您可能需要使用willSetdidSet,我能做到这一点吗?

是的,你可以这样做。因此,您可以为该变量设置一个didSet观察者,而不是手动更新标签:

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!

    var value = 0 {
        didSet {
            updateLabel()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        updateLabel()
    }

    @IBAction func didTapButton(_ sender: Any) {
        value += 1
    }

    private func updateLabel() {
        guard let label = label else { return }

        label.text = "\(value)"

        if value >= 10 {
            let controller = storyboard!.instantiateViewController(withIdentifier: "NextViewController")
            present(controller, animated: true)
        }
    }
}

当观察到的属性可能被其他类更新时,第二个didSet模式特别有用。

注意,我在这个观察者模式中在updateLabel方法中引入了一个微妙的变化。通常,视图控制器使用其隐式展开的可选插座(!后与@IBOutlet关联的类型),而不检查插座是否已连接,因为如果视图控制器达到该范围,他们可以确信代码的一部分,与视图控制器关联的视图也必须已加载。

但在这种观察者模式中,我们不知道这一点。例如,呈现视图控制器可以实例化该视图控制器,将value设置为除0之外的其他内容,然后呈现该视图控制器。在该场景中,在加载与此视图控制器关联的视图之前,正在更新value。幸运的是,这很容易通过多种方式解决。在此示例中,如果guard不是label,我会使用label创建本地nil引用。如果labelnil,则为return

答案 1 :(得分:0)

@IBAction buttonSelected(_ sender: UIButton) {
   var value = Int(label.text)
   value += 1
   if value >= 9 {
       //present ViewController C
   }
   else {
       label.text = "\(value)"
   }
}