2016-09-20 19 views

Trả lời

5

cuối cùng, bản thân tôi đã tìm ra giải pháp. Trong phương thức didSelectRow, kiểm tra xem ngày đã chọn có phải là chủ nhật không ??? nếu có thì ok nhưng nếu không thì hãy tải lại thành phần để chọn ngày chủ nhật gần nhất.

func pickerView (pickerView: UIPickerView, didSelectRow hàng: Int, inComponent thành phần: Int) {

if component == 0 { 
     pickerView.reloadComponent(1) 
    } 

    let titleLabel = pickerView.viewForRow(row, forComponent: component) as? UILabel 
    titleLabel?.font = UIFont(name: BCGConstants.Fonts.Name.ProximaNovaBold, size: 27)! 

    var dayValue = pickerView.selectedRowInComponent(1) + 1 
    let monthValue = pickerView.selectedRowInComponent(0) + 1 
    var yearValue = 0 

    let unitFlags: NSCalendarUnit = [.Day, .Month, .Year, .Weekday] 
    let currentDateComponents = NSCalendar.currentCalendar().components(unitFlags, fromDate: NSDate()) 

    if monthValue > currentDateComponents.month || (dayValue >= currentDateComponents.day && monthValue == currentDateComponents.month) { 
     yearValue = currentDateComponents.year 
    } else { 
     yearValue = currentDateComponents.year + 1 
    } 


    debugPrint("\(self.isGivenDaySunday(dayValue, selectedMonth: monthValue, selectedYear: yearValue)) day = \(dayValue) month = \(monthValue))") 

    let sundayCheck = self.isGivenDaySunday(pickerView.selectedRowInComponent(1) + 1, selectedMonth: pickerView.selectedRowInComponent(0) + 1, selectedYear: yearValue) 

    if sundayCheck.isSunday { 

     self.startDateTextField.text = sundayCheck.sundayDate?.fullStyleDateString 
     self.newBootcamp?.startDate = sundayCheck.sundayDate! 


    } else { 


     //   titleLabel?.font = UIFont(name: BCGConstants.Fonts.Name.ProximaNovaBold, size: 27)! 
     //   titleLabel?.textColor = UIColor.lightGrayColor() 

     if dayValue > 15 { 
      dayValue = pickerView.selectedRowInComponent(1) - (7 - sundayCheck.nextSundayAsWeekDay) 

      pickerView.selectRow(dayValue, inComponent: 1, animated: true) 
     } else { 
      dayValue = pickerView.selectedRowInComponent(1) + sundayCheck.nextSundayAsWeekDay 

      pickerView.selectRow(dayValue, inComponent: 1, animated: true) 
     } 


     var confirmSunday = self.isGivenDaySunday(dayValue + 1, selectedMonth: monthValue, selectedYear: yearValue) 
     // Added by mohsin : Reason bug : selecting previous day 
     if confirmSunday.sundayDate?.isLessThanDate(NSDate()) == true { 

      confirmSunday = self.isGivenDaySunday(dayValue, selectedMonth: monthValue, selectedYear: yearValue + 1) 
      //TODO: Need to be verify again : If not working fine then you must try to change next commented statement and uncomment it 
      // dayValue = pickerView.selectedRowInComponent(1) + sundayCheck.nextSundayAsWeekDay 

      pickerView.selectRow(dayValue - 1, inComponent: 1, animated: true) 

     } 

     self.startDateTextField.text = confirmSunday.sundayDate?.fullStyleDateString 
     self.newBootcamp?.startDate = confirmSunday.sundayDate! 

     debugPrint(confirmSunday.sundayDate?.fullStyleDateString) 


    } 

} 

Phương pháp mà kiểm tra chủ nhật đang theo dõi một

func isGivenDaySunday (selectedDay: Int, selectedMonth: Int , selectedYear: Int) -> (isSunday: Bool, nextSundayAsWeekDay: Int, sundayDate: NSDate) { hãy unitFlags: NSCalendarUnit = [.Day, .tháng, .năm, .Weekday]

let selectedDateComponents = NSDateComponents() 

    selectedDateComponents.month = selectedMonth 
    selectedDateComponents.day = selectedDay 
    selectedDateComponents.year = selectedYear 

    let selectedDate = NSCalendar(identifier: NSCalendarIdentifierGregorian)?.dateFromComponents(selectedDateComponents) 

    let newSelectedDateComponent = NSCalendar.currentCalendar().components(unitFlags, fromDate: selectedDate!) 

    if newSelectedDateComponent.weekday == 1 { // 1 means SUNDAY as per Gregorian 
     return (true, 0, selectedDate) 
    } else { 
     return (false, 8 - newSelectedDateComponent.weekday, nil) 

    } 

} 
Các vấn đề liên quan