【发布时间】:2021-06-20 13:28:37
【问题描述】:
我想在这里创建导航代码,我可以做到这一点SwiftUIKit。我正在SwiftUI 中尝试相同的功能,但我的代码遇到了问题。我们如何将SwiftUI 视图转换为AnyView。
有没有其他方法可以在SwiftUI 中实现相同的功能?
非常感谢您的帮助。!!
/// Swift code
public struct Navigator {
public var onLoginSuccess: (UINavigationController) -> Void = { navigationController in
navigationController.pushViewController(UIViewController(), animated: true)
}
}
/// Usage
var router = Navigator()
router.onLoginSuccess = { nav in
nav.pushViewController(UIViewController(), animated: true)
}
/// SwiftUI Code
struct Navigator {
static var onTap: (AnyView) -> Void = { view in
_ = view.navigate(to: Text("SS"))
}
}
extension View {
func navigate<SomeView: View>(to view: SomeView) -> some View {
modifier(NavigateModifier(destination: view))
}
}
fileprivate struct NavigateModifier<SomeView: View>: ViewModifier {
fileprivate let destination: SomeView
fileprivate func body(content: Content) -> some View {
NavigationView {
ZStack {
content
NavigationLink(destination: destination) {
EmptyView()
}
}
}
}
}
/// Usage
NavigationView {
Button("Home") {
Navigator.onTap(self)
}
}
这是另一个在单个目标上运行良好的解决方案代码,但我无法更改目标运行时。 Router.onLogin 应该接受目标视图。
struct ContentView: View {
var body: some View {
NavigationView {
HStack {
NavigationLink(destination: Router.onLogin) {
Text("HOME")
}
}
}
}
}
struct Router {
@ViewBuilder
static var onLogin: some View {
Text("Hello")
}
}
【问题讨论】:
-
这行不通,因为您将
Void返回到Void。因为这个_ =。您必须以某种方式在body或 SwiftUIViewModifier中激活NavigationLink。更改Button的action中的某些内容以制作NavigationLinkactive
标签: swift swiftui swiftui-navigationlink