SwiftUI ViewModifier不能作为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")
}
}

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

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)
}
}
}

相关内容

  • 没有找到相关文章

最新更新