合并框架更新 UI 无法正常工作
Combine Framework Update UI doesn't work properly
我想试试Combine
框架,用法很简单,按一个UIButton
,然后更新UILabel
。
我的想法是:
- 添加发布者
@Published var cacheText: String?
- 订阅
$cacheText.assign(to: \.text, on: cacheLabel)
- 按下按钮时分配一个值。
cacheText = "testString"
那么应该更新标签的文本。
问题是按下按钮时,@Published
值会更新,但 UILabel
值不会改变。
例如,cacheLabel1
最初被分配 123
,但在按下按钮时未分配 789
。
完整代码如下:
ViewModel.swift
import Foundation
import Combine
class ViewModel {
@Published var cacheText: String?
func setup(_ text: String) {
cacheText = text
}
init() {
setup("123")
}
}
ViewController.swift
class ViewController: UIViewController {
@IBOutlet weak var cacheLabel: UILabel!
var viewModel = ViewModel()
@IBAction func buttonPressed(_ sender: Any) {
viewModel.setup("789")
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel.$cacheText.assign(to: \.text, on: cacheLabel)
}
}
不确定我是否遗漏了什么,感谢您的帮助。
您还没来得及点击按钮,管道就快死了。你必须像这样保存它:
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
viewModel.$cacheText.assign(to: \.text, on: cacheLabel).store(in: &storage)
}
我想试试Combine
框架,用法很简单,按一个UIButton
,然后更新UILabel
。
我的想法是:
- 添加发布者
@Published var cacheText: String?
- 订阅
$cacheText.assign(to: \.text, on: cacheLabel)
- 按下按钮时分配一个值。
cacheText = "testString"
那么应该更新标签的文本。
问题是按下按钮时,@Published
值会更新,但 UILabel
值不会改变。
例如,cacheLabel1
最初被分配 123
,但在按下按钮时未分配 789
。
完整代码如下:
ViewModel.swift
import Foundation
import Combine
class ViewModel {
@Published var cacheText: String?
func setup(_ text: String) {
cacheText = text
}
init() {
setup("123")
}
}
ViewController.swift
class ViewController: UIViewController {
@IBOutlet weak var cacheLabel: UILabel!
var viewModel = ViewModel()
@IBAction func buttonPressed(_ sender: Any) {
viewModel.setup("789")
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel.$cacheText.assign(to: \.text, on: cacheLabel)
}
}
不确定我是否遗漏了什么,感谢您的帮助。
您还没来得及点击按钮,管道就快死了。你必须像这样保存它:
var storage = Set<AnyCancellable>()
override func viewDidLoad() {
super.viewDidLoad()
viewModel.$cacheText.assign(to: \.text, on: cacheLabel).store(in: &storage)
}