【问题标题】:Corrupted Navigation Views损坏的导航视图
【发布时间】:2020-06-19 17:21:51
【问题描述】:

我很确定这是 SwiftUI 中的一个错误,但我想知道是否有人遇到过它并想出了一个解决方法。我的正常用例是出现一个搜索字段,但我已将其简化到一个简单的文本字符串显示错误的地步。

创建一个单视图应用程序,将其复制到 ContentView 中,然后运行它。点击搜索图标两次,然后滚动视图;您会看到标题下方的文本滚动。

import SwiftUI

struct ContentView: View {
  private var items = (0 ... 50).map {String($0)}
  @State private var condition = false

  var searchButton: some View {
    Button(action: {self.condition.toggle()}) {
      Image(systemName: "magnifyingglass").imageScale(.large)
    }
  }

  var body: some View {
    NavigationView {
      VStack {
        if condition {
          Text("Peekaboo")
        }

        List {
          ForEach(items, id: \.self) {item in
            HStack {
              Text(item)
            }
          }
        }
      }
      .navigationBarTitle("List of Items")
      .navigationBarItems(leading: searchButton)
    }
  }
}

【问题讨论】:

    标签: list swiftui navigationview


    【解决方案1】:

    也许这是一个错误,向 Apple 提交反馈,但目前NavigationView 的行为是这样的 - 它只有 顶部内容是 List/ScrollView/Form 时才会折叠导航栏。因此,要解决此问题,请将您的 VStack 移至 List 或移出 NavigationView

    1)

      var body: some View {
        NavigationView {
            List {
              if condition {
                 Text("Peekaboo")
              }
              ForEach(items, id: \.self) {item in
    

    2)

        var body: some View {
            VStack {
             if condition {
                Text("Peekaboo")
             }
             NavigationView {
               List {
    

    【讨论】:

    • 我尝试了很多组合,包括那个,但是这个也不起作用。确实,列表不再完全位于标题后面,但它会将文本放在导航按钮上方(它应该在它们下方),并且列表标题仍然绘制不正确,只是现在它与列表中的第一个元素重叠。我有截图;我会将其添加到原始问题中。
    【解决方案2】:

    似乎视图无法处理可变数量的视图。 这种奇怪行为的解决方法是:

    import SwiftUI
    
    struct ContentView: View {
    private var items = (0 ... 50).map {String($0)}
    @State private var condition = false
    
    var searchButton: some View {
    Button(action: {self.condition.toggle()}) {
      Image(systemName: "magnifyingglass").imageScale(.large)
    }
    }
    
    var body: some View {
        NavigationView {
            VStack {
                if condition {
                    Text("Peekaboo")
                } else {
                    Text("")
                }
               // or use this  Text(condition ? "Peekaboo" : "")
                List {
                    ForEach(items, id: \.self) {item in
                        HStack {
                            Text(item)
                        }
                    }
                }
            }
            .navigationBarTitle("List of Items")
            .navigationBarItems(leading: searchButton)
        }
    }
    }
    

    如果它有效,请告诉我,如果无效,请告诉我们您使用的是什么设备/系统。使用 Xcode 11.6 beta、Mac 10.15.5、target ios 13.5 和 mac 催化剂进行测试。

    【讨论】:

    • 感谢您的建议,但这也不起作用。我正在实现的东西不是文本,而是搜索文本字段;该文本仅用于此示例。根据理论,问题在于子视图的数量是可变的,只需将条件文本包装在 Group 中就会使计数保持不变,但这也不起作用。我正在使用 Xcode beta 和 13.6 iOS;没有在 Catalyst 上尝试过。
    • 后续:添加 else {Text("")} 确实会停止滚动渲染故障,但滚动会在大标题所在的位置留下空白。我正在添加一个屏幕截图,其中空格标记为红色。
    • 如果 Apple 的任何人读到此问题,我已提交反馈 FB7739422 和 FB7743113。
    • 我很高兴你已经尝试过了。要修复空白,可以使用 EmptyView(),而不是 Text("")。
    • 我先尝试了 EmptyView();那也没有用。它转移到滚动标题后面的列表的原始行为。我认为这是因为“编译的”视图表示省略了空视图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2011-09-17
    • 2015-04-05
    • 1970-01-01
    相关资源
    最近更新 更多