簡體   English   中英

iOS Swift:選擇一個我想選擇整行的單元格

[英]iOS swift: selecting a cell I want to select the entire row

我有一個日歷,當我選擇一天時,我想選擇整行(一周)。這是到目前為止的代碼:

//When a date is selected
func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) {

    selectTheWeek(of: date)
    setupLayoutCell(cell: cell, cellState: cellState)

}

func selectTheWeek(of date: Date) {
    let starOfTheWeek = date.startOfWeek()
    let endOfTheWeeK = date.endOfWeek()
    calendarCollectionView.selectDates(from: starOfTheWeek, to: endOfTheWeeK)
}

extension Date {
func startOfWeek() -> Date {
    let calendar = Calendar.autoupdatingCurrent
    let currentDateComponents = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
    return calendar.date(from: currentDateComponents)!
}

func endOfWeek() -> Date {
    let cal = Calendar.autoupdatingCurrent
    var component = DateComponents()
    component.weekOfYear = 1
    component.day = -1
    return cal.date(byAdding: component, to: startOfWeek())!
}
}

問題是我遇到了無限循環,原因很明顯。 但是我不知道如何預防。 有什么幫助嗎?

JTAppleCalender是一個外部庫。 它是collectionView的擴展。

您可以使用2種技巧來打破循環。

首先

calendarViewselectDates(from: starOfTheWeek, to: endOfTheWeeK, triggerSelectionDelegate: false)

通過將triggerSelectionDelegate設置為false,將不會調用您的委托函數didSelect


第二:

如果您使用的是MasterBranch代碼(我將在一周左右的時間內發布該代碼),則可以知道您的選擇是否是程序員發起的還是 用戶發起的 您知道-> cellState。

if cellState.selectionType == .programatic {
   // ignore stuff        
} else {
   // Do stuff
}

您可以將此if語句放入shouldSelect函數中。

我知道這不是最好的解決方案,但可以避免出現問題

//When a date is selected
var shouldSelectWeek = true
func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) {
    if shouldSelectWeek{
        selectTheWeek(of: date)
        shouldSelectWeek = false
    }
    setupLayoutCell(cell: cell, cellState: cellState)


}

func selectTheWeek(of date: Date) {
    let starOfTheWeek = date.startOfWeek()
    let endOfTheWeeK = date.endOfWeek()
    calendarCollectionView.selectDates(from: starOfTheWeek, to: endOfTheWeeK)
}

extension Date {
    func startOfWeek() -> Date {
        let calendar = Calendar.autoupdatingCurrent
        let currentDateComponents = calendar.dateComponents([.yearForWeekOfYear, .weekOfYear], from: self)
        return calendar.date(from: currentDateComponents)!
    }

    func endOfWeek() -> Date {
        let cal = Calendar.autoupdatingCurrent
        var component = DateComponents()
        component.weekOfYear = 1
        component.day = -1
        return cal.date(byAdding: component, to: startOfWeek())!
}

只需添加一個新的布爾變量,如var shouldIgnoreDateSelection = false ,然后就可以了

func calendar(_ calendar: JTAppleCalendarView, didSelectDate date: Date, cell: JTAppleCell?, cellState: CellState) {
    if shouldIgnoreDateSelection == false {
        selectTheWeek(of: date)
    }
    setupLayoutCell(cell: cell, cellState: cellState)
}

func selectTheWeek(of date: Date) {
    let starOfTheWeek = date.startOfWeek()
    let endOfTheWeeK = date.endOfWeek()
    shouldIgnoreDateSelection = true
    calendarCollectionView.selectDates(from: starOfTheWeek, to: endOfTheWeeK)
    shouldIgnoreDateSelection = false
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM