簡體   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