如何在函数中传入 SwiftUI 视图?
How can I pass in a SwiftUI View in a function?
我正在开发的应用程序主要使用 UIKit。对于较小的组件,我们开始转向 SwiftUI,我想编写一个简洁的小扩展,它可以接受 SwiftUI 视图和 return UIKit 视图。这是我目前拥有的代码:
static func getUIView(for swiftUIView: View) -> UIView {
let hostingController = UIHostingController(rootView: swiftUIView)
return hostingController.view
}
}
但是这会引发错误
Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements
有人可以向我解释为什么这是个问题吗?实现这个问题的正确方法是什么?
您只需将您的方法设为泛型并将泛型类型限制为 View
。
static func getUIView<V: View>(for swiftUIView: V) -> UIView {
let hostingController = UIHostingController(rootView: swiftUIView)
return hostingController.view
}
但是,我宁愿建议在 View
上创建一个计算 属性,从视图本身 returns 一个 UIView
。
extension View {
var uiView: UIView {
UIHostingController(rootView: self).view
}
}
然后在要转换为UIView
的View
上调用它:
Text("Label").uiView
我正在开发的应用程序主要使用 UIKit。对于较小的组件,我们开始转向 SwiftUI,我想编写一个简洁的小扩展,它可以接受 SwiftUI 视图和 return UIKit 视图。这是我目前拥有的代码:
static func getUIView(for swiftUIView: View) -> UIView {
let hostingController = UIHostingController(rootView: swiftUIView)
return hostingController.view
}
}
但是这会引发错误
Protocol 'View' can only be used as a generic constraint because it has Self or associated type requirements
有人可以向我解释为什么这是个问题吗?实现这个问题的正确方法是什么?
您只需将您的方法设为泛型并将泛型类型限制为 View
。
static func getUIView<V: View>(for swiftUIView: V) -> UIView {
let hostingController = UIHostingController(rootView: swiftUIView)
return hostingController.view
}
但是,我宁愿建议在 View
上创建一个计算 属性,从视图本身 returns 一个 UIView
。
extension View {
var uiView: UIView {
UIHostingController(rootView: self).view
}
}
然后在要转换为UIView
的View
上调用它:
Text("Label").uiView