在SwiftUI中推入新视图时隐藏TabBar

3

如何在使用NavigationLink跳转到新视图时隐藏TabBar?

以下是我如何推出下一个视图的示例代码:

TabView {
    NavigationView {
        List(fakeUser) { user in
            NavigationLink(destination: ChatDetailView(user: user)) {
                ChatCell(user: user)
            }
        }
        .navigationBarTitle("Chats")
        .navigationBarItems(leading: leadingBarItem, trailing: trailingBarItem)
    }
    .tabItem {
        Image(systemName: "message.fill")
            .font(.system(size: 20))
        Text("Chats")
    }
}

我已成功构建了一个视图层次结构,它提供了您请求的行为,但是在返回根SwiftUI时会抛出异常'NSInternalInconsistencyException',原因:'尝试弹出到不存在的视图控制器。'这完全是来自SwiftUI视图构造方法的无稽之谈。所以,由于这个问题,我无法将其作为答案提出,但从理论上讲,当SwiftUI变得更加稳定时,这是有可能实现的。 - Asperi
只需发布它并让人们知道这个内容 - SwiftiSwift
https://dev59.com/y1MI5IYBdhLWcg3wA2ns - zrfrank
2个回答

3

注意:在Xcode 11.2/iOS 13.2上会出现异常情况

根据我的理解,这里提供了您要求的效果所需的重新布局。

但是,虽然下面的代码没有任何问题,但在导航返回时,UIKit的内部出现了异常:

 2019-11-24 10:54:36.644037+0200 Test[1180:41920] *** Terminating
app due to  uncaught exception 'NSInternalInconsistencyException',
reason:  'Tried to pop to a view controller that doesn't exist.'
*** First throw call stack: ( 0 CoreFoundation 0x00007fff23c4f02e __exceptionPreprocess + 350 1 libobjc.A.dylib 0x00007fff50b97b20 objc_exception_throw + 48 2 CoreFoundation 0x00007fff23c4eda8 +[NSException raise:format:arguments:] + 88 3 Foundation 0x00007fff256c9b61 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191 4 UIKitCore 0x00007fff4713d9d1 __57-[UINavigationController popToViewController:transition:]_block_invoke + 620

请参考以下代码:

var body: some View {
    NavigationView {
        TabView {
            List(fakeUser) { user in
                NavigationLink(destination: ChatDetailView(user: user)) {
                    ChatCell(user: user)
                }
            }
            .navigationBarTitle("Chats")
            .navigationBarItems(leading: leadingBarItem, trailing: trailingBarItem)
            .tabItem {
                Image(systemName: "message.fill")
                    .font(.system(size: 20))
                Text("Chats")
            }
        }
        .navigationBarTitle("Chats")
    }
}

1
它可以工作,但是NavigationView将应用于所有TabView。我不想要那种行为。 - SwiftiSwift
正如你所说,当我关闭详细视图时,应用程序会崩溃。 - SwiftiSwift

1
在iOS 16中,您有以下选项:
.toolbar(.hidden, for: .tabBar)

只需将其附加到即将被推送的视图上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接