为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI

Posted

技术标签:

【中文标题】为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI【英文标题】:Why swipeActions modifier does not work with List container directly? #SwiftUI为什么 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI 【发布时间】:2021-06-16 06:04:47 【问题描述】:

新引入的 swipeActions 修饰符不能直接与显示排列的数据行的 List 容器一起使用。但是,如果我使用 ForEach(一种从已识别数据的基础集合中按需计算视图的结构),它就可以正常工作。

以下代码不起作用并显示 swipeActions

struct SwipeButtonDemoView: View 
  let listItems = WWDCViewModel().sessions
  var body: some View 
    NavigationView 
      VStack 
        Spacer()
        List(listItems)   session in
            HStack 
              Image(systemName: "play")
              Text(session.title)
                .font(.callout)
            
            .swipeActions(edge: .leading) 
              Button 
                print("Bookmark")
               label: 
                Label("Bookmark", systemImage: "bookmark")
              .tint(.indigo)
            
          
          .listRowSeparator(.hidden)
          
      .listStyle(.inset)
      .navigationTitle("WWDC 21")
    
  

以下代码有效并显示 swipeActions..

struct SwipeButtonDemoView: View 
  let listItems = WWDCViewModel().sessions
  var body: some View 
    NavigationView 
      VStack 
        Spacer()
        
        List 
          ForEach(listItems)  session in
            HStack 
              Image(systemName: "play")
              Text(session.title)
                .font(.callout)
            
            .swipeActions(edge: .leading) 
              Button 
                print("Bookmark")
               label: 
                Label("Bookmark", systemImage: "bookmark")
              .tint(.indigo)
            
          
          .listRowSeparator(.hidden)
          
        
      .listStyle(.inset)
      .navigationTitle("WWDC 21")
    
  

为什么它不能直接与 List 一起使用?但是,它可以与 ForEach 一起按预期工作!!!

【问题讨论】:

【参考方案1】:

您是对的,在 Xcode 13 beta 1 中,swipeActions 不能应用于 List 的内部块声明,因此您的示例的这个版本不起作用:

List(listItems)  session in
  HStack 
    Image(systemName: "play")
    Text(session.title)
      .font(.callout)
  
  .swipeActions(edge: .leading) 
    // etc
  

似乎有一个有效的用例可以为这样的List 声明提供滑动操作,因此值得使用反馈助手向 Apple 提出建议。

【讨论】:

以上是关于为啥 swipeActions 修饰符不能直接与 List 容器一起使用? #SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

为啥全局修饰符不能正常工作?

为啥我们不能在 C# 中覆盖方法时更改访问修饰符?

java - 为啥在java中可以具有默认修饰符的类不能受到保护

为啥类或接口不能接收私有或受保护的访问修饰符?

为啥我们不能在 Kotlin 的 Singleton 类(对象)中使用受保护的访问修饰符

有了private修饰符,为啥可以直接访问其他对象中的成员?