2016-07-21 13 views
2

So arbeite ich mit der iOS Mapkit, und ein Teil der Anwendung erfordert, dass ich vor langer Zeit eine Anmerkung platziert wurde, wenn jemand darauf klopft. Bisher habe ich versucht, dies:Wie man vor langer Zeit eine Annotation platziert wurde iOS

//MARK: Report Date And Time Details 
    let ReportTime = NSDate() 
    let TimeStamp = NSDateFormatter() 
    TimeStamp.timeStyle = NSDateFormatterStyle.ShortStyle 
    TimeStamp.dateStyle = NSDateFormatterStyle.ShortStyle 
    TimeStamp.stringFromDate(ReportTime) 

und dann die Beschreibung der Anmerkung zu Report Time. Anstatt dies zu tun, möchte ich für die Anmerkung sagen "53,54,55 Minuten Ago etc." Gibt es einen einfachen Weg, dies zu erreichen?

Vielen Dank!

+1

versuchen, eine 'NSDateIntervalFormatter' – dan

Antwort

1

Zwei Dinge:

  1. Ablauf der Zeit zu bekommen, würde ich ein NSDateComponentsFormatter schlage vor, mit:

    let formatter = NSDateComponentsFormatter() 
    formatter.allowedUnits = [.Hour, .Minute] 
    formatter.unitsStyle = .Full 
    
    let string = formatter.stringFromDate(date1, toDate: date2) 
    

    , die einen String erzeugt, der wie folgt aussieht:

    2 Stunden, 1 Minute

  2. Wenn Sie möchten, dass das Callout nur die verstrichene Zeit anzeigt, definieren Sie am einfachsten eine benutzerdefinierte Annotation mit einer berechneten Eigenschaft für title (oder subtitle, je nachdem, was Sie bevorzugen). Zum Beispiel:

    class CustomAnnotation: NSObject, MKAnnotation { 
        let startDate = NSDate() 
        var coordinate: CLLocationCoordinate2D 
        var subtitle: String? 
    
        init(coordinate: CLLocationCoordinate2D) { 
         self.coordinate = coordinate 
         super.init() 
        } 
    
        var title: String? { 
         let formatter = NSDateComponentsFormatter() 
         formatter.allowedUnits = [.Hour, .Minute] 
         formatter.unitsStyle = .Full 
    
         let elapsedString = formatter.stringFromDate(startDate, toDate: NSDate())! 
    
         return "Added \(elapsedString) ago" 
        } 
    } 
    

    Hinweis, ist hier der Schlüssel, dass ich eine berechnete Eigenschaft bin mit, nicht eine gespeicherte Eigenschaft für title, die Sie mit MKPointAnnotation bekommen. Dies stellt sicher, dass jedes Mal, wenn das Callout angezeigt wird, die Eigenschaft erneut abgerufen wird, und NSDateComponentsFormatter berechnet die entsprechende Zeichenfolgendarstellung der verstrichenen Zeit neu.

Klar, können Sie dies ändern, wie Sie sehen, passen (zB ist startDate wirklich nur, wenn Sie die Anmerkung erstellt, oder ist es eine gespeicherte Eigenschaft, die Sie aus Ihrer Datenquelle einstellen können, man muss die initializer ändern können Übergeben Sie zusätzliche Eigenschaften; usw.), aber dies veranschaulicht die Grundidee.

enter image description here

+0

Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackoverflow.com/rooms/117984/discussion-between-rob-and-user154248). – Rob