如何获得iOS已注释的注释

时间:2016-07-21 23:40:29

标签: ios swift nsdate nsdateformatter

所以我正在使用iOS Mapkit,部分应用程序要求我很久以前就会显示一个注释,当有人点击它时。到目前为止,我已经尝试过这个:

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

然后将注释的描述设置为Report Time。而不是这样做,我希望注释说“53,54,55分钟前等”有没有一种简单的方法来实现这一目标?

全部谢谢!

1 个答案:

答案 0 :(得分:1)

两件事:

  1. 为了节省时间,我建议使用NSDateComponentsFormatter

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

    生成一个看起来像的字符串:

      

    2小时1分钟

  2. 如果您只是希望标注显示已用时间,最简单的方法是使用title(或subtitle的计算属性定义自定义注释,无论您喜欢哪个) 。例如:

    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"
        }
    }
    

    注意,这里的关键是我使用的是计算属性,而不是title的{​​{1}}存储属性。这确保了每次出现标注时,它都会重新检索属性,MKPointAnnotation将重新计算经过时间的相应字符串表示。

  3. 显然,您可以根据需要更改此选项(例如,NSDateComponentsFormatter实际上只是在创建注释时,或者是您可以从数据源设置的存储属性;您可以将初始化程序更改为传递额外的属性;等),但这说明了基本的想法。

    enter image description here