+-

最近在用SwiftUI写一个APP,偶发性出现一个标题栏重影的BUG,就像这样:
问题分析:
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") })) } }
目前查阅了很多资料,没有得到一个合理的解决方案,欢迎有碰到过这个问题的大哥交流交流。
问题已复现。
解决方法:指定 navigationViewStyle
NavigationView{ NavigationLink( destination: SubView(), label: { Text("去下一页") }) .navigationBarTitle(Text("Main View"),displayMode: .inline) }.navigationViewStyle(StackNavigationViewStyle())