我在UIView控制器中使用Swiftui来显示内容.在Swiftui有一个表格.填写完表格后,点击UIView控制器导航栏上的Run按钮,触发Swiftui中的函数执行.
UIView控制器代码如下:
import UIKit
import SwiftUI
class TestVC: UIViewController {
var testView1: TestView1?
override func viewDidLoad() {
super.viewDidLoad()
self.setupData()
self.setupUI()
}
func setupData() {
}
func setupUI() {
self.navigationController?.navigationBar.isTranslucent = false
setupNavBar()
let contentView = TestView1()
let hostVC = UIHostingController(rootView: contentView)
guard let hostView = hostVC.view else {
return
}
view.addSubview(hostView)
hostView.frame = self.view.frame
self.testView1 = contentView
}
func setupNavBar() {
let item1 = UIBarButtonItem(customView: self.runBtn)
navigationItem.rightBarButtonItems = [item1]
}
lazy var runBtn: UIButton = {
let btn = UIButton()
btn.setTitle("Run", for: .normal)
btn.setTitleColor(.blue, for: .normal)
btn.addTarget(self, action: #selector(runBtnAction), for: .touchUpInside)
return btn
}()
@objc func runBtnAction() {
self.testView1?.run2()
}
}
SwiftUI查看器代码如下:
import SwiftUI
struct TestView1: View {
@State private var inputContent: String = "init"
var body: some View {
return VStack(spacing: 20) {
ScrollView(showsIndicators: false) {
Button {
run1()
} label: {
Text("Run")
.foregroundColor(.blue)
}
TextEditor(text: $inputContent)
.foregroundColor(.black)
.background(Color.gray.opacity(0.2))
}
}
.foregroundColor(.black)
.background(Color.white)
}
public func run1() {
inputContent = "run test 1"
print("run1 inputContent is \(inputContent)")
}
public func run2() {
// inputContent should be "run test 1" but output is "init"
print("run2 before inputContent is \(inputContent)")
inputContent = "run test 2"
// inputContent should be "run test 2" but output is still "init"
print("run2 after inputContent is \(inputContent)")
}
}
首先在SwiftUI中点击"Run"按钮,打印"run1 inputContent is run test 1" 这符合人们的预期. 然而,当在TestVC中点击"Run"按钮时,它总是打印"run2 inputContent is init ",而不是修改后的新值.
如何在UIKit中正确调用Swiftui的函数?