2017-10-16 193 views
0

我有一個日曆,我希望當我選擇每天選擇一整行(周)..這是到目前爲止我的代碼:iOS的SWIFT:選擇單元格我要選擇整行

//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的延伸。

+0

嘗試添加一個布爾值來檢查函數是從代碼中添加日期還是從用戶 –

+0

什麼?你對用戶意味着什麼? –

+0

我將添加代碼作爲答案 –

回答

1

你可以使用2種技術來打破循環。

首先

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

通過設置triggerSelectionDelegate爲假,你的委託功能didSelect將不會被調用。


二:

如果您正在使用MasterBranch代碼(我將在一週左右將發佈),你就可以知道你的選擇是否正在程序員開始 VS 用戶發起。你通過 - > cellState知道這一點。

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

您可以在shouldSelect功能把這個if語句。

+0

謝謝,現在我有不同的圈子爲選定的日子,就像你在教程中做過的那樣。我怎麼能做出一個圓整的邊緣? –

+0

1.'let cellStatus = calendarView.cellStatus(for:myDate)'2.'cellStatus.cell'讓您訪問單元格以修改 –

+0

我的意思是這樣的:https://cloud.githubusercontent.com/assets/ 17156261/25841123/8c55b2e6-34bc-11e7-8500-c599312022ed.png –

0

我知道這是不是最好的解決方案,但它可以工作,以避免您的問題

//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())! 
} 
0

只需添加一個新的布爾變量像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 
}