繁体   English   中英

SwiftUI ViewModifier 不能用作 NavigationLink

[英]SwiftUI ViewModifier not working as a NavigationLink

我有以下ViewModifier但它不起作用:

import SwiftUI

struct NavLink: ViewModifier {
    let title: String
    
    func body(content: Content) -> some View {
        NavigationLink(destination: content) {
            Text(title)
        }
    }
}

extension View {
    func navLink(title: String) -> some View {
        modifier(NavLink(title: title))
    }
}

如果我按如下方式使用它:

import SwiftUI

struct MainScreen: View {
    var body: some View {
        NavigationStack() {
            VStack {
                // This does not work
                NavStackScreen()
                    .navLink(title: "Nav Stack")

                // But this does
                Helper.linked(to: NavStackScreen(), title: "Nav Stack 2")
            }
        }
    }
}

struct Helper {
    static func linked(to destination: some View, title: String) -> some View {
        NavigationLink(destination: destination) {
            Text(title)
        }
    }
}

它创建链接并在点击时将新视图推送到屏幕上; 但是,NavStackScreen 的内容不显示,只是一个空屏幕。 关于发生了什么的任何想法?

NavStackScreen 的内容供参考:

struct NavStackScreen: View {
    var body: some View {
        Text("Nav Stack Screen")
            .font(.title)
            .navigationTitle("Navigation Stack")
    }
}

如果我在辅助结构中使用静态辅助函数,那么它可以正常工作:

    static func linked(to destination: some View, title: String) -> some View {
        NavigationLink(destination: destination) {
            Text(title)
        }
    }

我添加了 MainView 的完整代码以供参考,并用更多细节更新了示例,以便于复制。

修饰符不起作用,因为content参数不是被修改的实际视图,而是一个代理:

content 是视图的代理,它将应用 Self 表示的修饰符。

参考

这是对修改器的快速调试显示的内容:

(lldb) po content
SwiftUI._ViewModifier_Content<SwiftUIApp.NavLink>()

由于代理是 SwiftUI 的一种内部类型,我们无法确定NavigationLink为什么不能使用它。

一种解决方法是跳过修饰符,仅在View上添加扩展名:

extension View {
    func navLink(title: String) -> some View {
        NavigationLink(destination: content) {
            Text(title)
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM