ios - 从 SwiftUI 视图调用本地 UIViewController 函数
问题描述
我正在尝试从 ContentView 调用本地 ViewController 函数。该函数使用一些局部变量,不能移到 ViewController 之外。
class ViewController: UIViewController {
func doSomething() {...}
}
extension ViewController : LinkViewDelegate {...}
位于不同的文件中:
struct ContentView: View {
init() {
viewController = .init(nibName:nil, bundle:nil)
}
var viewController: viewController
var body: some View {
Button(action: {self.viewController.doSomething()}) {
Text("Link Account")
}
}
}
UIViewController 不能更改为 UIViewRepresentable 之类的东西,因为 LinkViewDelegate 只能扩展 UIViewController。
解决方案
这是我想出的一种方法,它不会导致“在视图更新期间修改状态,这将导致未定义的行为”问题。诀窍是将您的 ViewModel 的引用传递给 ViewController 本身,然后重置调用您的函数的布尔值,而不是在您的 UIViewControllerRepresentable 中。
public class MyViewModel: ObservableObject {
@Published public var doSomething: Bool = false
}
struct ContentView: View {
@StateObject var viewModel = MyViewModel()
var body: some View {
MyView(viewModel: viewModel)
Button("Do Something") {
viewModel.doSomething = true
}
}
}
struct MyView: UIViewControllerRepresentable {
@ObservedObject var viewModel: MyViewModel
func makeUIViewController(context: Context) -> MyViewController {
return MyViewController(viewModel)
}
func updateUIViewController(_ viewController: MyViewController, context: Context) {
if viewModel.doSomething {
viewController.doSomething()
// boolean will be reset in viewController
}
}
}
class MyViewController: UIViewController {
var viewModel: MyViewModel
public init(_ viewModel: MyViewModel) {
self.viewModel = viewModel
}
public func doSomething() {
// do something, then reset the flag
viewModel.doSomething = false
}
}
推荐阅读
- sql - 在 Hive 中,如何使用 explode(XPATH(..)) 函数读取 XML 中存在的 NULL/空标签?
- c - 我认为 C 无法读取我的输入。(我仍然是学习 c 的初学者)
- python-3.x - Djongo 模型 - 如何摆脱:AssertionError 类型的对象不是 JSON 可序列化的
- android - 使用 Firebase 和 Cloud 功能在特定时间发送推送通知
- python - 更改两个字典中的值和键
- javascript - 什么是 toString(),为什么它与 this.toString() 不同?
- flutter - 可滚动的警报对话框颤振
- python-3.x - @on_message.error AttributeError:'function' 对象在 discord.py 中没有属性'error'
- c# - Httpclient计算多个url远程文件大小
- python - 如果存在相同的重复条目,如何填充列的 NaN