【问题标题】:Swift UI: relationship between the sheet and list viewsSwift UI:工作表和列表视图之间的关系
【发布时间】:2020-01-12 08:42:13
【问题描述】:

我有以下示例视图来尝试SwiftUIsheet 的行为:

import SwiftUI

struct Word: Identifiable, Codable {
 var id: String
}

struct TestView: View {
  @State var isPresented = false
   var items: [Word] = [Word(id: "Test1"),
                     Word(id: "Test2"),
                     Word(id: "Test3")]
 var body: some View {
   NavigationView {
     List {
       ForEach(items) { word in
          Text(word.id)
     }
   }
  .sheet(isPresented: $isPresented) {
    SomeTestViewInsideTheSheet(action: {
        self.isPresented = false
      })
    .frame(minHeight: 0, maxHeight: 400, alignment: .center)
    }
  .navigationBarTitle(Text("My Title"))
   }
  }
}

struct SomeTestViewInsideTheSheet: View {
   var action: ()->()
   var body: some View {
       VStack {
        Text("Test View")
        Button("Dismiss") {
            self.action()
        }
    }
  }
}

我只是想了解: list 和 sheet 之间的关系是什么?为什么我应该在列表末尾使用.sheet 将工作表与列表联系起来? 在此示例中显示工作表的正确方法是什么。

附言示例代码在 XCode 项目中编译良好,但在 Playground 中编译不正常。

【问题讨论】:

    标签: ios swift xcode swiftui


    【解决方案1】:

    为什么要在列表末尾使用.sheet 将工作表与列表绑定?

    您没有将工作表与列表捆绑在一起。您也没有在列表末尾添加.sheet。再次阅读您的代码!您在NavigationView 的末尾添加.sheet

    因此,NavigationView(“顶级”视图对象)将新的顶级视图呈现为工作表。这实际上并不是“捆绑”任何东西。如您所见,单击列表项不会执行任何操作。 .sheet 这里真的只是作为一个“声明”,我将展示一张表格。

    在这个例子中显示工作表的正确方法是什么。

    要实际呈现工作表,您需要将isPresented 设置为true。您可以随时将其设置为 true。但是看到你有一个List,我猜你想在选择一个项目时将它设置为true。您可以使用Buttons 而不是Texts 来选择列表项:

     List {
       ForEach(items) { word in
          Button(word.id) {
            self.isPresented = true
          }
     }
    

    【讨论】:

    • 在 NavigationView 末尾声明 .sheet 和在 List 末尾声明 .sheet 有什么区别?都编译成功。
    • @JAHelia 是的,但是如果你把它放在List 的末尾,你就不能第二次展示这张纸了。你会得到一个警告,说你正在尝试展示已经展示过的东西。我对 SwiftUI 也很陌生,所以我不知道确切发生了什么。但是顶层视图呈现另一个顶层视图更有意义,不是吗?
    • 是的,将它添加到顶层视图中比添加到嵌套视图中更合理,而且我可以看到很多关于第二次呈现工作表问题的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多