ios - 向后滑动失败时,SwiftUI 导航栏项目变得困惑

标签 ios navigation swiftui swipe

我有一个 ListView , TasksView然后 EditView .

流程是这样的:您有一个列表单元格,您点击将您带到 TasksView 的单元格。当在 TasksView 中点击一行时它带你到EditView .

当我向后滑动一半以导航到上一个 View 时,导航栏会变得笨拙并重叠。它主要发生在我使用navigationBarItem - (按钮)时。

TasksView (detailView)有一个列表和一些导航栏修饰符:

ZStack {
   List {
    // code here
 }

}
.onAppear { UITableView.appearance().separatorStyle = .none }
.onDisappear { UITableView.appearance().separatorStyle = .none }
.background(Color("primaryBackground"))
.edgesIgnoringSafeArea(.bottom)
.navigationBarTitle("\(listItem.name ?? "")", displayMode: .inline)
.navigationBarItems(trailing:
    Button(action: {self.deleteList()}) {
              Image(systemName: "trash.circle.fill")
          }
     )
EditView 也可以这样说,当您在 EditView 上滑动一半时返回 TasksView ,同样的事情也会发生。

以下是实际操作中的错误:

enter image description here

有人知道如何解决此错误吗?

编辑:
struct TasksView: View {
@Environment(\.presentationMode) var presentationMode
@EnvironmentObject var taskControl: TaskControl
@EnvironmentObject var addNewTaskData: AddNewTaskViewDataFlow
@ObservedObject var dataPickerData : DatePickerDataFlowV2


@FetchRequest(entity: ONList.entity(), sortDescriptors: []) var listsDataSource: FetchedResults<ONList>
@Environment(\.managedObjectContext) var listMOC

   var listItem: ONList
   var keyboardPublisher: AnyCancellable

 // defining the presentationMode here 

 .......

ZStack {
        NavigationLink(destination: ListOptions(listItem: listItem), tag: 1, selection: self.$navigationSelectionTag) {
            EmptyView()
        }

        Color("primaryBackground")
            .edgesIgnoringSafeArea(.top)

        //... more code here
      }

    .onAppear {

        UITableView.appearance().separatorStyle = .none
        self.taskControl.taskViewerSeperator = true
    }
    .onDisappear {
        UITableView.appearance().separatorStyle = .none
        print("Bye Task View")

        if UIDevice.current.userInterfaceIdiom == .phone {
          self.taskControl.taskViewerSeperator = false
        }

        self.keyboardPublisher.cancel()
    }
    .navigationBarTitle("\(listItem.name ?? "")", displayMode: .inline)
    .background(Color("primaryBackground"))
    .edgesIgnoringSafeArea(.bottom)
    .navigationBarItems(trailing:
        HStack {
        Button(action: {
        self.navigationSelectionTag = 1
    }, label: {
        Image(systemName: "gear")
    })

       Button(action: {
        self.deleteList()

       }) {
          Image(systemName: "trash.circle.fill")

    }.padding()

    }
  )

我什至没有使用 deleteList() 中的演示模式函数以在当前 View 被删除时关闭它。但是,我仍然遇到与上面的 gif 相同的故障。

更新:
struct TestingCoreData: View {

var body: some View {
    NavigationView {
        VStack {
            NavigationLink(destination: DestinationView()) {
                 Text("This is a test")
            }


        }.navigationBarTitle(Text("Master"), displayMode: .inline)
         .navigationBarItems(trailing:
            Button(action: {
                print("tapped")
            }) {
                Text("Button")
            }

        )
    }
}
}

struct DestinationView: View {

@Environment(\.presentationMode) var presentationMode
var body: some View {

List {
    Text("DestinationView")
        .padding(.top, 100)
        .navigationBarTitle(Text("Destination"), displayMode: .inline)
        .navigationBarItems(trailing: Button(action: {
            self.presentationMode.wrappedValue.dismiss()
        }, label: {
            Text("second")
        }))
}

}
}

上面的代码重现了这个错误。当你点击“这是一个测试”按钮,然后你往回滑动一点,然后回到最后一个 View ,你会看到导航栏变得乱七八糟!

最佳答案

我找到了一个简单的解决方案来解决您的问题,将其添加到 NavigationView

    NavigationView {
        ....
    }.navigationViewStyle(StackNavigationViewStyle())

编辑:这是我用来在真实设备和各种模拟器上测试我的答案的代码。这解决了问题,如果您发现无法正常工作的设备,请告诉我。
import SwiftUI

struct ContentView: View {
var body: some View {
    NavigationView {
        VStack {
            NavigationLink(destination: DestinationView()) {
                Text("This is a test")
            }
        }.navigationBarTitle(Text("Master"), displayMode: .inline)
            .navigationBarItems(trailing:
                Button(action: {
                    print("tapped")
                }) {
                    Text("Button")
            })
    }.navigationViewStyle(StackNavigationViewStyle())
}
}

struct DestinationView: View {
@Environment(\.presentationMode) var presentationMode
var body: some View {
    List {
        Text("DestinationView")
            .padding(.top, 100)
            .navigationBarTitle(Text("Destination"), displayMode: .inline)
            .navigationBarItems(trailing: Button(action: {
                self.presentationMode.wrappedValue.dismiss()
            }, label: {
                Text("second")
            }))
    }
}
} 

关于ios - 向后滑动失败时,SwiftUI 导航栏项目变得困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62083810/

相关文章:

android - 防止在弹出后重新导航,在 onObserve 中?

css - IE 中的下拉导航隐藏/不工作

ios - SwiftUI @Published 属性不更新 View

ios - 加快像素迭代

ios - UIButton 以编程方式在 UITableView 的一部分中创建,以隐藏/显示该部分的内容

ios - 在从 Environment.SpecialFolder.LocalApplicationData 加载的文件上设置 BaseUrl

ios - Swift 属性只有在存在 didSet 时才能正确设置(可以为空)

ios - PassKit 不可预测的崩溃

HTML/CSS 导航事件状态

json - SwiftUI - 类型 'Service' 不符合协议(protocol) 'Decodable'