首页 > 解决方案 > 网格内的多选 - SwiftUI

问题描述

我正在尝试在动态网格中实现多选。使用此代码,它以图形方式将所有元素一起选择,基本上它们都会改变颜色。它保存所选数据中的数据,但在图形上它们都被选中,我一次不能选择并保存多个。
我认为问题可能出在网格上,但我也尝试使用其他库更改网格,但它没有改变任何东西。在我只有一个数组并且它可以工作之前,现在从数据库中获取数据却不是。

我仍在使用并且必须使用 swiftui 1,所以我没有在新的 swiftui 中提供网格。

我将这个库用于网格,https://github.com/spacenation/swiftui-grid,模块化网格之一,因为我有来自数据库的这些事件。

谢谢。

struct ItemsEventSelectionView: View {

@ObservedObject var eventItems = getEventItems()

@State var eventSelections = [EventItem]()

@State var style2 = ModularGridStyle(.vertical, columns: .min(70), rows: .fixed(40))

@EnvironmentObject var globalDataObservableObject: GlobalDataObservableObject
    
var body: some View {
    ZStack(alignment: Alignment(horizontal: .center, vertical: .top)) {
        Group {
            Rectangle()
                .fill(UIManager.bgGradient)
                .frame(minWidth: 0, maxWidth: .infinity)
                .edgesIgnoringSafeArea(.all)
        }
        
        VStack(alignment: .leading) {
            
            
            
            ScrollView(self.style2.axes) {
                
                Grid(self.eventItems.events) { event in
                    
                    HStack {
                        MultipleSelectionEvent(title: event.name!, isSelected: self.eventSelections.contains(event)) {
                            
                            
                            if self.eventSelections.contains(event) {
                                self.eventSelections.removeAll(where: { $0 == event })
                            }
                            else {
                                self.eventSelections.append(event)
                            }
                        }
                    }
                }
                
            }.gridStyle(self.style2)
        }
    }

}
}




struct MultipleSelectionEvent: View {
var title: String
var isSelected: Bool
var action: () -> Void

var body: some View {
    Button(action: self.action) {
        HStack{
            
            if self.isSelected {
                
                
                Text(self.title)
                    .font(UIManager.einaBodySemibold)
                    .foregroundColor(UIManager.hBlue)
                    
                    
                    .padding(.vertical, 7)
                    .padding(.horizontal, 10)
                    .background(UIManager.hBlueLight)
                    .cornerRadius(6)
                
            } else {
                
                Text(self.title)
                    .font(UIManager.einaBody)
                    .foregroundColor(UIManager.hDarkBlue)
                    .padding(.vertical, 7)
                    .padding(.horizontal, 10)
                    .background(UIManager.hLightGrey)
                    .cornerRadius(6)
            }
        }
    }
}
}



class getEventItems : ObservableObject {

let didChange = PassthroughSubject<getEventItems,Never>()

@Published var events = [EventItem]() {
    didSet {
        didChange.send(self)
    }
}

func getEventItems() {
    
    EventItemViewModel().fetchEvents(complete: { (eventItems) in
        self.events = eventItems
    })
    
}

init() {
    getEventItems()
}

}

标签: swiftui

解决方案


推荐阅读