SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象

Posted

技术标签:

【中文标题】SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象【英文标题】:Multiple sheet(item: ) triggered by SwipeActions button and ToolBar buttons gets nil object in the first time in SwiftUI 【发布时间】:2021-12-09 22:59:56 【问题描述】:

我在列表和工具栏按钮的 ForEach 循环中使用 swipeActions 在我的 SwiftUI 视图上显示不同的工作表。但是每次我向左滑动并单击编辑按钮时,该行的对象为零。如果我做同样的滑动并再次单击,一切顺利。其他人以前有过这种错误吗?谢谢。

下面是相关代码:

struct LanguagesView: 查看

@State var activeSheet: ActiveSheet?
@State var toBeEdit: MeLanguage?
   
var body: some View 
    NavigationView 
        List 
            ForEach(self.meLanguages, id: \.id)  lan in                   
                    HStack 
                        Text("\(lan.wrappedName)")
                            .font(.headline)
                    .swipeActions(allowsFullSwipe: false) 
                        Button(
                            action: 
                                self.activeSheet = .editLanguage
                                self.toBeEdit = lan
                            ,
                            label:  Label("Edit", systemImage: "pencil") 
                        ) .tint(.indigo)
                    
            
        
        .sheet(item: $activeSheet,
               onDismiss: 
            self.toBeEdit = nil
        
         )
             item in
             switch item 
             case .addLanguage:
                 AddLanguage()
             case .sortLanguages:
                 SortLanguagesView()
             case .editLanguage:
                 if self.toBeEdit != nil 
                     EditLanguageView( meLanguage: self.toBeEdit! )
                 
                 else 
                     Text("self.toBeEdit is nil")
                 
             default:
                 Text("No such button on ContentView.")
             
         
        
        .toolbar 
            ToolbarItemGroup 
                HStack 
                    Text("\(self.meLanguages.count) Languages on Card").font(.headline)
                    self.barButtons
                
            
        
    

var barButtons: some View 
    HStack 
        
        Button(
            action: 
                self.activeSheet = .sortLanguages
            ,
            label:  Label("Sort Languages", systemImage: "arrow.up.arrow.down.circle")
            
        ).id("sortLanguages")
        
        Button(
            action: 
                self.activeSheet = .addLanguage
            ,
            label:  Label("Add Language",
                systemImage: "plus")
                    .imageScale(.large)
            
        )
    

如果我只想到由 swipeActions Edit 按钮触发的工作表,那么下面的代码可以完美运行。但我仍然需要由 ToolBar 按钮触发的其他工作表。

 .sheet(item: self.$toBeEdit, content:  toBeEdit in
                EditLanguageView( meLanguage: toBeEdit)                        
            )

【问题讨论】:

【参考方案1】:

经过更多搜索后,我意识到这与 SwipeActions 无关。这实际上类似于这个问题:

SwiftUI presenting sheet with Binding variable doesn't work when first presented

所以我在 ForEach 循环之后添加了一个隐藏的文本,问题就解决了。

ForEach(self.meLanguages, id: \.id)  ... 
if self.toBeEdit != nil 
                    Text("\(self.toBeEdit!.wrappedName)").hidden()
                

【讨论】:

以上是关于SwipeActions 按钮和 ToolBar 按钮触发的多个工作表(项目:)在 SwiftUI 中首次获取 nil 对象的主要内容,如果未能解决你的问题,请参考以下文章

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

vb中toolbar 和activebar怎么用

toolbar左上角的后退按钮怎么获取到监听

按下 ToolBar 按钮时向 UIViewController 添加和删除子 ViewController

Android中toolbar遮盖住其他控件该怎么解决

toolbar右边怎么添加新的功能按钮