我有一個UIKit的ViewController,它使用ViewControllerRepresentable嵌套在一個SwiftUI視圖中。SwiftUI視圖管理著我想在UIKit視圖中顯示的一些狀態(在這個例子中,是一個Int)。當用戶在SwiftUI父視圖中點擊一個按鈕時,狀態的變化應該反映在UIKit視圖中。我已經嘗試使用@Binding屬性包裝器來保持兩者的同步,但顯然我錯過了什么,因為我的視圖控制器的初始化器拋出了一個編譯時錯誤。
我是iOS開發的新手,所以我可能在這里走了一個完全錯誤的方向。如果有任何幫助,我們將不勝感激。
代碼如下(簡化):
struct ContentView。View {
@State private var currentNumber。Int
init(currentNumber: Int) {
self.currentNumber = currentNumber
}
var body: some View {
FancyLabelViewControllerRepresentable(currentNumber: self.$currentNumber)
Button("Increment"/span>) {
self.currentNumber = 1.
}
}
}
struct FancyLabelViewControllerRepresentable: UIViewControllerRepresentable {
typealias UIViewControllerType = FancyLabelViewController >。
@Binding var currentNumber: Int
init(currentNumber: Binding<Int>) {
self._currentNumber = currentNumber
}
func makeUIViewController(context: Context) -> FancyLabelViewController {
let fancyLabel = FancyLabelViewController( number: self.currentNumber)
fancyLabel.currentNumberInLabel = self.currentNumber
return fancyLabel
}
func updateUIViewController(_ uiViewController: FancyLabelViewController, context: Context) {
uiViewController.currentNumberInLabel = self.currentNumber
}
}
class FancyLabelViewController: UIViewController {
var label = UILabel()
@Binding var currentNumberInLabel: Int
init(number: Int) {
// Error: 'self' used in property access 'currentNumberInLabel' before 'super.init' call。
self.currentNumberInLabel = number
//錯誤。屬性'self.currentNumberInLabel'在super.init呼叫時未被初始化。
super.init(nibName: nil, bundle: nil)
}
required init(coder: NSCoder) {
fatalError("未實作")
}
override func viewDidLoad() {
super.viewDidLoad()
label.text = "(currentNumberInLabel)"。
查看 = 標簽
}
}
uj5u.com熱心網友回復:
我認為你不需要
@Binding var currentNumberInLabel: Int
因為UIViewControllerRepresentable已經負責更新currentNumberInLabel值,但你還需要更新
label.text = "(currentNumberInLabel)"
所以我做了類似的事情
class FancyLabelViewController。UIViewController {
var label = UILabel()
var currentNumberInLabel: Int
init(number: Int) {
self.currentNumberInLabel = number
super.init(nibName: nil, bundle: nil)
}
required init(coder: NSCoder) {
fatalError("未實作")
}
override func viewDidLoad() {
super.viewDidLoad()
label.text = "(currentNumberInLabel)"。
查看 = 標簽
}
func updateLabel() {
label.text = "(currentNumberInLabel)"。
}
}
并從UIViewControllerRepresentable呼叫updateLabel作為
func updateUIViewController(_ uiViewController: FancyLabelViewController, context: Context) {
uiViewController.currentNumberInLabel = self.currentNumber
uiViewController.updateLabel()
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/333984.html
標籤:
