【问题标题】:Preselection of an item on LazyHGrid在 LazyHGrid 上预选项目
【发布时间】:2022-01-30 00:51:32
【问题描述】:

大家好,我正在使用 LazyHGrid 网格显示分为 2 行的 19 个单元格,其内容是用户可以选择的时间。

我的预选有问题,例如,我希望在显示水平网格时,可以看到基于当前时间的预选

我会给你一个网格的例子


| 9:30 | - | 10:00 | - | 10:30 | - | 11:00 |


如果此时是 10:20,我是否希望在用户看到网格时自动选择包含文本 10:30 的单元格第一次


| 9:30 | - | 10:00 | - | 10:30 | - | 11:00 |
如果当前时间是 10:20

,则在 10:30 进行预选

简而言之,我需要选择包含比当前时间提前半小时的时间的单元格

这是我到目前为止所做的

你能帮帮我吗?

struct TimeSelectorView: View {
    
    @State private var selectedItem: Int = 0
    
    @Binding var date: Date
    
    var body: some View {
        
        VStack (alignment: .center, spacing: 20) {
            ScrollView(.horizontal, showsIndicators: false) {
                ScrollViewReader { reader in
                    LazyHGrid(rows: Array(repeating: GridItem(.adaptive(minimum: 100, maximum: .infinity), spacing: 0), count: 2), spacing: 0) {
                        ForEach(reservationTimeItems.indices) { value in
                        
                            TimeSelectorCellView(selectedItem: $selectedItem, 
                              date: $date, 
                              hours: reservationTimeItems[value].hour, 
                              minute: reservationTimeItems[value].minute, 
                              item: value)
                                
                            .frame(width: (screen.size.width - 20 ) / 4)
                            .padding([.top, .bottom], 10)
                            .id(value)
                        }
                    }
                    .onAppear { scrollTo((8, 12, 0), reader) }
                    .onChange(of: date) { _ in scrollTo((8, 12, 0), reader) }
                    .onChange(of: selectedItem) { newValue in

                    date = Calendar.current.date(bySettingHour: reservationTimeItems[newValue].hour, 
                    minute: reservationTimeItems[newValue].minute, 
                    second: 0, of: date)!
                }
                }
            }
            .frame(height: 110)
        }
    }
}

struct TimeSelectorCellView: View {
       
    @Binding var selectedItem: Int
    @Binding var date: Date
    
    private var selectionColor: Color { selected ? .greenApp : .white }
    private var selectionOpacity: CGFloat { selected ? 1 : 0 }
    
    private var selected: Bool {
        selectedItem == item
    }
    
    private var disableItem: Bool {
        // Disabilita la cella nel caso in cui la data selezionata è quella di oggi e l'orario della data corrente è inferiore a quello contenuto nella cella
        Date().checkTime(hour: hours, minute: minute) && date.isToday()
        // oppure se la data selezionata è inferiore a quella corrente
        || date.isPreviousDate()
    }
    
    var hours: Int // Ore della data
    var minute: Int // Minuti della data
    var item: Int

    var body: some View {
        
        VStack(alignment: .leading, spacing: 10) {
            
            HStack(alignment: .center, spacing: 2) {
                                
                Text(hours < 10 ? "0\(hours)" : "\(hours)")
                    .foregroundColor(disableItem ? disabledColor : selectionColor)
                    .font(.system(size: 23))
                
                // Minuti
                HStack(spacing: 3) {
                    Text(":").foregroundColor(.white)
                    Text(minute < 10 ? "0\(minute)" : "\(minute)")
                        .foregroundColor(disableItem ? disabledColor : selectionColor)
                }
                .font(.footnote)
            }
        }
        // Selezione e feedback tattile
        .onTapGesture {
            UIImpactFeedbackGenerator(style: .medium).impactOccurred()

            DispatchQueue.main.async {
                withAnimation(.easeInOut(duration: animationDuration)) {
                    // Gestisce la selezione della cella
                        selectedItem = item
                }
            }
        }
        .disabled(disableItem)
    }
}

【问题讨论】:

    标签: ios swift xcode date lazyhgrid


    【解决方案1】:

    提供的代码中没有指定reservationTimeItems的类型,所以假设reservationTimeItems的类型是[ReservationTime],其中ReservationTime的定义如下:

    struct ReservationTime: Identifiable, Equatable {
        let id: UUID = UUID()
        var hour: Int
        var minute: Int
        
        static func ==(lhs: ReservationTime, rhs: ReservationTime) -> Bool {
            lhs.hour == rhs.hour && lhs.minute == rhs.minute
        }
    }
    

    我会添加这个扩展:

    extension Date {
        var hour: Int {
            Calendar.current.dateComponents([.hour], from: self).hour ?? 0
        }
        var minute: Int {
            Calendar.current.dateComponents([.minute], from: self).minute ?? 0
        }
        var nextReservationTime: ReservationTime {
            let nextHalfHour = self.minute < 30 ? self.hour : (self.hour + 1) % 24
            let nextHalfMinute = self.minute < 30 ? 30 : 0
            
            return ReservationTime(hour: nextHalfHour, minute: nextHalfMinute)
        }
    }
    

    然后,在TimeSelectorView:

    struct TimeSelectorView: View {
        @State private var selectedItem: Int = 0  
    
        // ...
        
        var body: some View {
            VStack(alignment: .center, spacing: 20) {
                // ...
            }.onAppear {
                selectedItem = reservationTimeItems.firstIndex(of: Date().nextReservationTime) ?? 0
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多