2017-10-16 3 views
0

Ich habe einen Kalender auswählen möchten, und ich möchte eine ganze Zeile (Woche) wählen, wenn ich einen Tag auswählen .. das ist mein Code so weit:iOS swift: Auswählen einer Zelle I die gesamte Zeile

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

das Problem ist, dass ich eine Endlosschleife habe, und es ist der Grund klar. Aber ich weiß nicht, wie ich das verhindern kann. Irgendeine Hilfe?

JTAppleCalender ist eine externe Bibliothek. Es ist eine Erweiterung von collectionView.

+0

versuchen, einen Boolean hinzuzufügen, um zu überprüfen, ob die Funktion die Tage aus dem Code oder vom Benutzer –

+0

was? Was meinst du mit dem Benutzer? –

+0

Ich füge den Code als Antwort hinzu –

Antwort

1

Sie kann 2 Techniken verwenden, um die Schleife zu durchbrechen.

Erste:

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

von triggerSelectionDelegate auf false gesetzt, Ihre Delegatfunktion didSelect wird nicht aufgerufen werden.


Zweitens:

Wenn Sie MasterBranch Code verwenden (was ich in einer Woche der Freigabe würde oder so), können Sie wissen, ob Ihre Auswahl wird Programmierer vs initiiert Benutzer initiiert. Sie wissen das durch -> CellState.

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

Sie können diese if-Anweisung in Ihre shouldSelect-Funktion einfügen.

+0

danke, jetzt habe ich verschiedene Kreise für die ausgewählten Tage, wie die einstmals in dir gemachten Tutorials. Wie könnte ich eine ganze Reihe mit abgerundeten Kanten machen? –

+0

1. 'lass cellStatus = calendarView.cellStatus (für: meinDatum)' 2. 'cellStatus.cell' gibt dir Zugriff auf die zu modifizierende Zelle –

+0

ich meine etwas wie das: https://cloud.githubusercontent.com/assets/ 17156261/25841123/8c55b2e6-34bc-11e7-8500-c599312022ed.png –

0

Ich weiß, das ist eine nicht die bestmögliche Lösung, aber es könnte funktionieren Ihr Problem

//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

Fügen Sie einfach einen neuen boolean Variable wie var shouldIgnoreDateSelection = false zu vermeiden und dann tun Sie gerade

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 
} 
Verwandte Themen