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:如何将数据从主机发送到辅助视图?