2015-11-22 2 views
1

Кто-нибудь знает, как я могу это решить? Я получаю эту ошибку:Swift: Невозможно преобразовать значение типа «NSDate» в ожидаемый тип аргумента «NSDateComponents»

¨cannot convert value of type 'NSDate' to expected argument type 'NSDateComponents'¨ on line:

произошла ошибка в строке:

let competitionDay = userCalendar.dateFromComponents(competitionDate)! 

Это более полный фрагмент кода:

func Date() {    

    // Here we set the current date 

    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let components = calendar.components([.Hour, .Minute, .Second, .Nanosecond], fromDate: date) 
    let hour = components.hour 
    let minutes = components.minute 
    let month = components.month 
    let year = components.year 
    let day = components.day 


    let currentDate = calendar.dateFromComponents(components) 



    // here we set the due date. When the timer is supposed to finish 
    // final Calendar value 

     let userCalendar = NSCalendar.currentCalendar() 


     let competitionDate:NSDate = myDatePicker.date 


     competitionDate.timeIntervalSinceNow 


     let competitionDay = userCalendar.dateFromComponents(competitionDate)! 


    // Here we compare the two dates 
    competitionDay.timeIntervalSinceDate(currentDate!) 


    let dayCalendarUnit = calendar.components([NSCalendarUnit.Day, NSCalendarUnit.Hour, NSCalendarUnit.Minute], fromDate: date) 


    //here we change the seconds to hours,minutes and days 


    let competitionDayDifference = calendar.components([.Day, .Hour, .Minute], 
      fromDate: currentDate!, toDate: competitionDay, options: NSCalendarOptions()) 

    //finally, here we set the variable to our remaining time 
    let daysLeft = competitionDayDifference.day 
    let hoursLeft = competitionDayDifference.hour 
    let minutesLeft = competitionDayDifference.minute 
+0

Какая линия отображает ошибку? –

+1

Не ясно ли сообщение об ошибке? 'dateFromComponents()' принимает аргумент NSDateComponents. В 'dateFromComponents (contestDate)' вы передаете NSDate. –

+0

@MartinR Знаете ли вы, как я могу это решить? Если вы можете показать его в коде, который был бы оценен – Gjeruldsen

ответ

1

В первоначальном вопросе вы звонили dateFromComponents, который преобразует NSDateComponents в NSDate, но предоставил ему competitionDate, который уже является NSDate. И компилятор просто информировал вас об этой ошибке.

-

Как и в сторону, вы заселить NSDateComponents с .Hour, .Minute, .Second и .Nanosecond из NSDate, но затем приступить к попытке сохранить ссылки на components.year и components.month и components.day, даже если вы не указали, что эти компоненты должны быть включены в NSDateComponents.

-

Ниже вы говорите:

It's a Countdown app and i had it running until i wanted a DatePicker to choose the date i am counting down. The competitionDate is the due date

Если это действительно то, что вы хотите, то, возможно, NSDateComponents не нужен вообще. Я бы просто использовал метод NSDateComponentsFormatterstringFromDate:toDate:, чтобы показать пользователю хорошее строковое представление количества времени между двумя объектами NSDate.

Например:

class ViewController: UIViewController { 

    @IBOutlet weak var datePicker: UIDatePicker! 
    @IBOutlet weak var label: UILabel! 

    weak var timer: NSTimer? 

    let formatter: NSDateComponentsFormatter = { 
     let _formatter = NSDateComponentsFormatter() 
     _formatter.allowedUnits = [.Year, .Month, .Day, .Hour, .Minute, .Second] 
     _formatter.unitsStyle = .Full 

     return _formatter 
    }() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     datePicker.date = NSDate().dateByAddingTimeInterval(1000) // initialize it to whatever you want 
    } 

    override func viewDidAppear(animated: Bool) { 
     super.viewDidAppear(animated) 

     timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "didFireTimer:", userInfo: nil, repeats: true) 
    } 

    override func viewDidDisappear(animated: Bool) { 
     super.viewDidDisappear(animated) 

     timer?.invalidate() 
    } 

    func didFireTimer(timer: NSTimer) { 
     label.text = formatter.stringFromDate(NSDate(), toDate: datePicker.date) 
    } 
} 
+0

Благодарим вас за ответ. Вероятно, я должен был понять, как это исправить, но я был бы очень признателен, если бы вы могли показать мне, как я могу решить это с помощью кода? – Gjeruldsen

+0

Это приложение обратного отсчета, и у меня его работало, пока я не хотел, чтобы DatePicker выбирал дату, которую я подсчитываю. КонкурсДата - это срок – Gjeruldsen

+0

Жаль за это. Я просто обновил вопрос. Надеюсь, теперь это станет понятным. Выход, который я хочу, - это только разность дат между currentDate и contestDate. – Gjeruldsen

Смежные вопросы

 Смежные вопросы