SwiftUI在iOS上NavigationBar标题重影问题复现

发布于 2022-09-12 23:34:33 字数 1958 浏览 24 评论 0

最近在用SwiftUI写一个APP,偶发性出现一个标题栏重影的BUG,就像这样:

image.png

问题分析:

1. 从主页面导航到子页面,子页面动态读取了一个数组,ForEach渲染了一个列表。
2. 打开子页面瞬间 通过右滑关闭手势尝试关闭页面 但滑动一点后取消操作。
3. 再次通过右滑关闭子页面,此时,子页面的导航栏出现到了主页面上,产生重影。
4. 复现过程中,在列表渲染前左滑并取消,或者在列表渲染后左滑并取消,不会出现这个问题

复现源代码:

import SwiftUI
struct ContentView: View {
    var body: some View {
        NavigationView{
            NavigationLink(
                destination: SubView(),
                label: {
                    Text("去下一页")
                })
                .navigationBarTitle(Text("Main View"),displayMode: .inline)
        }
    }
}
struct SubView:View {
    @State var message: String = "左滑并保持不要返回\n等显示操作成功时瞬间松开取消\n重新左滑返回即可复现BUG"
    @State var list: [String] = []
    var body: some View{
        VStack{
            Text(message)
            ForEach(0..<list.count){ index in
                Text(list[index])
            }
        }
        .onAppear(){
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 3) {
                self.message = "操作成功,请左滑返回上一页"
                self.list = [
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                    "测试1",
                ]
            }
        }
        .navigationBarTitle(Text("Sub View"),displayMode: .inline)
        .navigationBarItems(
            trailing: Button(action: {
                self.message = "Right tapped!"
            }, label: {
                Text("Right")
            }))
        
    }
}

目前查阅了很多资料,没有得到一个合理的解决方案,欢迎有碰到过这个问题的大哥交流交流。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

人事已非 2022-09-19 23:34:33

问题已复现。

解决方法:指定 navigationViewStyle

NavigationView{
            NavigationLink(
                destination: SubView(),
                label: {
                    Text("去下一页")
                })
                .navigationBarTitle(Text("Main View"),displayMode: .inline)
        }.navigationViewStyle(StackNavigationViewStyle())
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文