2016-06-01 2 views
-1

Так что мой код делает то, что он принимает NSDate от UIDaterPicker (timePicker) и изменяет часовой пояс. После этого он возвращается в NSDate для запуска NSTimer.Найденный nil в функции NSDateFormatter

Но он падает внутри функции convertToDate. По-видимому, кажется, что я пытаюсь принудительно отключить разворот. Но почему это необязательно?

@IBOutlet weak var timePicker: UIDatePicker! 

     func convertTime() -> String { 
      let date = timePicker.date 
      print("date", date) 
      let myTimeZone = NSTimeZone.localTimeZone() 
      let df = NSDateFormatter() 
      df.timeZone = myTimeZone 
      df.dateFormat = "yyyy.MM.dd G 'at' HH:mm:ss zzz" 
      let time = df.stringFromDate(date) 

      return time 
     } 

     func convertToDate() -> NSDate { 
      let date = convertTime() 
      let dateformatter = NSDateFormatter() 
      let convertedTime = dateformatter.dateFromString(date) 

      return convertedTime! 
     } 

func fireTime() -> NSDate { 
     let time = convertToDate().dateByAddingTimeInterval(60*60*2.4) 
     return time 
    } 

    func updateTimeLeft() { 
     let elapsedTime = fireTime().timeIntervalSinceDate(NSDate()) 
     self.ringTime.text = NSDateComponentsFormatter().stringFromTimeInterval(elapsedTime) 
    } 

timer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: #selector(ViewController.updateTimeLeft), userInfo: nil, repeats: true) 
+2

'NSDate' не имеет часового пояса для изменения. –

+1

Слово предупреждения с точки зрения архитектуры. Лучше сделать ваши небольшие вспомогательные функции, такие как 'convertToDate()', 'fireTime()' использовать параметры для своих входных данных, а не напрямую обращаться к полям объектов. Таким образом, эти функции легко проверяются изолированно. – Alexander

+1

Знаете ли вы о опциях? Вы знаете, что вы на самом деле делаете с 'return convertTime!'? У вас есть googled документы? – luk2302

ответ

1

NSDateFormatter возвращает необязательный, потому что не каждая строка представляет собой действительную дату. Опциональность позволяет элегантно ответить: «Это не действительные данные в соответствии с форматом, который вы мне сказали».

func convertToDate() -> NSDate { 
     let date = convertTime() 
     let dateformatter = NSDateFormatter() 
     dateformatter .dateFormat = "INSERT DATE FORMAT HERE" 

     if let convertedTime = dateformatter.dateFromString(date) { 
      return convertedTime 
     } 
     else { 
      //formatting failed. Handle the error here 
     } 
    } 

Вы не дали строку формата для его использования, поэтому он не знает, как разобрать дату, таким образом, он возвращает ноль.

Если вы разместите пример своих данных, я покажу вам нужную строку формата.

+0

какие данные вы имели в виду? – R3ptor

+0

«Дата», которую вы пытаетесь разобрать – Alexander

+0

Это значение от UIDatePicker, и я хочу отобразить оставшееся время до тех пор, пока эта метка не встретится в метке ringTime. – R3ptor

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