只需要一个友好的建议。假设您有3个viewcontrollers:
ViewController A ViewController B ViewController C
在ViewController A中,您有一个按钮和标签。标签具有默认文本0.当您单击按钮时,它将为标签添加1为1,然后为2然后为3,依此类推。当它达到10时,它将以模态方式调用ViewController C.我读到你可能需要使用willSet或didSet,我是否正确?有关此事的任何建议?感谢。
答案 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
)之间保持清晰的分离。
但你问:
我知道您可能需要使用
willSet
或didSet
,我能做到这一点吗?
是的,你可以这样做。因此,您可以为该变量设置一个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
引用。如果label
为nil
,则为return
。
答案 1 :(得分:0)
@IBAction buttonSelected(_ sender: UIButton) {
var value = Int(label.text)
value += 1
if value >= 9 {
//present ViewController C
}
else {
label.text = "\(value)"
}
}