2017-04-20 1 views
-2

J'ai donc ce code qui prend la date à laquelle un temps a été posté et le convertit en quelque chose comme "5h" ou "1d" il y a. Cependant, il s'affiche dans mon application comme quelque chose comme ceci - Facultatif (1) h.Swift 3 - Réception d'une valeur facultative lorsque la valeur est une chaîne

Voici le code:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "admincell", for: indexPath) as! AdminHomeCell 

    let post = activities[indexPath.row] 
    print(post["path"]) 
    //let image = images[indexPath.row] 
    //let imaged = post["path"] as! String 
    //let image = URL(string: imaged) 
    let username = post["username"] as? String 
    let title = post["title"] as? String 
    let date = post["date"] as! String 
    let description = post["text"] as? String 
    let location = post["location"] as? String 

    let dateFormater = DateFormatter() 
    dateFormater.dateFormat = "yyyy-MM-dd-HH:mm:ss" 
    let newDate = dateFormater.date(from: date)! 

    let from = newDate 
    let now = Date() 
    let components : NSCalendar.Unit = [.second, .minute, .hour, .day, .weekOfMonth] 
    let difference = (Calendar.current as NSCalendar).components(components, from: from, to: now, options: []) 

    if difference.second! <= 0 { 
     cell.postDate.text! = "now" 
    } 
    if difference.second! > 0 && difference.minute! == 0 { 
     cell.postDate.text! = "\(difference.second)s." // 12s. 
    } 
    if difference.minute! > 0 && difference.hour! == 0 { 
     cell.postDate.text! = "\(difference.minute)m." 
    } 
    if difference.hour! > 0 && difference.day! == 0 { 
     cell.postDate.text! = "\(difference.hour)h." 
    } 
    if difference.day! > 0 && difference.weekOfMonth! == 0 { 
     cell.postDate.text! = "\(difference.day)d." 
    } 
    if difference.weekOfMonth! > 0 { 
     cell.postDate.text! = "\(difference.weekOfMonth)w." 
    } 



    /* 
    let session = URLSession(configuration: .default) 
    let downloadPicTask = session.dataTask(with: image!) { 
     (data, response, error) in 
     if let e = error { 
      print("Error downloading image: \(e)") 
     } else { 
      if let res = response as? HTTPURLResponse { 
       if let image = data { 
        let pic = UIImage(data: image) 
        cell.postImage.image = pic 
       } else{ 
        print("couldn't get image: image is nil") 
       } 
      } else { 
       print("Couldn't get response code") 
      } 

     } 
    } 
    */ 
    cell.postTitle.text = title 
    cell.postUser.text = username 
    cell.postDescription.text = description 
    cell.postLocation.text = location 
    cell.postDate.text = date 

    cell.postDescription.lineBreakMode = .byWordWrapping // or NSLineBreakMode.ByWordWrapping 
    cell.postDescription.numberOfLines = 0 



    //downloadPicTask.resume() 
    return cell 
} 

S'il y a quelque chose que je devrais changer pour le faire simplement afficher « 1h », s'il vous plaît laissez-moi savoir! Merci!

+3

Pourquoi ne pas utiliser 'DateComponentsFormatter' au lieu de réinventer la roue? – rmaddy

Répondre

0

Mettez à jour Xcode à 8.3 ou plus récent, il y a un avertissement que vous imprimez une valeur facultative au lieu d'une valeur normale.

Dans votre code, vous utilisez DateComponents et tous les champs sont facultatifs, comme par ex. difference.hour. Vous utilisez ! avant d'extraire la valeur pour la comparer, mais ce n'est pas un bon moyen car il bloque l'application si la valeur n'est pas là.

Ce que vous devez faire est comme ceci:

guard let hour = difference.hour, 
     let minute = difference.minute, [...] else { return cell } 
// below code using hour as not optional 

dans la méthode pour chaque valeur en option pour déballer en toute sécurité.

0

Swift 3 tous les composants de date sont optionals mais vous pouvez en toute sécurité déroulez tous les optionals qui sont spécifiées dans dateComponents(from:to:

Je recommande d'utiliser des variables locales:

let difference = Calendar.current.dateComponents([.second, .minute, .hour, .day, .weekOfMonth], from: from, to: now) 
let diffSec = difference.second! 
let diffMin = difference.minute! 
let diffHour = difference.hour! 
let diffDay = difference.day! 
let diffWeekOfMonth = difference.weekOfMonth! 

if diffSec <= 0 { 
    cell.postDate.text! = "now" 
} 
if diffSec > 0 && diffMin == 0 { 
    cell.postDate.text! = "\(diffSec)s." // 12s. 
} 
if diffMin > 0 && diffHour == 0 { 
    cell.postDate.text! = "\(diffMin)m." 
} 
if diffHour > 0 && diffDay == 0 { 
    cell.postDate.text! = "\(diffHour)h." 
} 
if diffDay > 0 && diffWeekOfMonth == 0 { 
    cell.postDate.text! = "\(diffDay)d." 
} 
if diffWeekOfMonth > 0 { 
    cell.postDate.text! = "\(diffWeekOfMonth)w." 
} 

NEANMOINS un oeil à DateComponentsFormatter