2017-10-16 116 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 
}