NavigationLink 从其子视图返回视图后不可点击

Posted

技术标签:

【中文标题】NavigationLink 从其子视图返回视图后不可点击【英文标题】:NavigationLink is not clickable after returning to the view from it's child view 【发布时间】:2020-12-13 12:27:36 【问题描述】:

我的应用具有多级布局 AView -> BView -> CView -> DView。

我变了

window.rootViewController

到 BView 以“弹出”2 个顶部视图,但由于某种原因,当我回到 BView 时,它的 NavigationLink 不可点击。

关于如何解决这个问题的任何想法?似乎 BView 不知道它变得可见..

AView.swift:

import SwiftUI

struct AView: View 
    
    init() 
        print("AView init")
    
    

    var body: some View 
        
        NavigationView 
            VStack 
                NavigationLink(destination: BView()) 
                    Text("This is View A, now go to View B.")
                
            
        
    


struct BView: View 
    init() 
        print("BView init")
    
    

    var body: some View 
        NavigationLink(destination: CView()) 
                Text("This is View B, now go to View C.")
        
    


struct CView: View 
    
    init() 
        print("CView init")
    
    
    var body: some View 
        NavigationLink(destination: DView()) 
                Text("This is View C, now go to View D.")
        
    


struct DView: View 
    init() 
        print("DView init")
    
    
    var body: some View 

        Button(action: 
            print("button pressed")
            (UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate)?.toBView()

        ,
               label: 
            Text("Back!")
        )

    

SceneDelegate.swift:

import UIKit
import SwiftUI

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

    var window: UIWindow?

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
        // Create the SwiftUI view that provides the window contents.
        let aView =     AView()
        
        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene 
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: aView)
            self.window = window
            window.makeKeyAndVisible()
        
    
    
    func toBView() 
        let bView = BView()
        window?.rootViewController = UIHostingController(rootView: bView)
    


【问题讨论】:

在提供的 SwiftUI 视图中没有什么不好的......最好展示你如何使用 rootViewController - 这是 SwiftUI 行为被破坏的原因。 抱歉,我刚刚更新了 SceneDelegate 的代码 嗯...这不是“流行”,您只需销毁所有内容(即整个视图层次结构)并在根级别创建唯一的BView 但为什么会出现不可点击的 NavigationLink ? 【参考方案1】:

Asperi 已经说明了问题..您将 BView 设置为根级别。实际上改变它,应该不是什么大问题。

但是回到你的问题,为什么NavigationLink 不再起作用了。那是因为包含NavigationView 的 ViewA 不再位于 RootLevel 中。因此,您需要提供一个新的 NavigationView,但仅当且仅当 BView 是根视图时。

所以在 BView 里面,添加一个参数isRootView,当你从你的SceneDelegate 调用它时,你才会将它设置为true

struct BView: View 
    init(isRootView: Bool = false) 
        print("BView init")
        self.isRootView = isRootView
    
    
    var isRootView : Bool = false

    var body: some View 
        if isRootView 
            NavigationView 
                NavigationLink(destination: CView()) 
                        Text("This is View B, now go to View C.")
                
            
        
        else
        
            NavigationLink(destination: CView()) 
                    Text("This is View B, now go to View C.")
            

        
    

这里是来自 SceneDelegate 的调用

func toBView() 
    let bView = BView(isRootView: true)
    window?.rootViewController = UIHostingController(rootView: bView)

【讨论】:

以上是关于NavigationLink 从其子视图返回视图后不可点击的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI中NavigationLink多层嵌套导航无法返回上一层的原因及解决

SwiftUI中NavigationLink多层嵌套导航无法返回上一层的原因及解决

从模态视图使用 NavigationLink 的 SwiftUI 推送视图

NavigationLink 101:如何将数据从主机发送到辅助视图?

SwiftUI NavigationLink:成功运行帐户创建代码后导航到目标视图

SwiftUI - 使工具栏的 NavigationLink 使用详细视图