【问题标题】:swift - How sort alphabetically annotations arrayswift - 如何按字母顺序对注释数组进行排序
【发布时间】:2018-07-09 23:08:40
【问题描述】:

我的项目是一个有很多注释点的地图,用户可以通过pickerView来查找特定的注释。一切都很好,除了所有注释点的列表似乎是随机显示的。我想按字母顺序对注释进行排序。

这是我当前的工作代码:

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

        return self.mapView.annotations[row].title ?? "No title"

    }

    func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
        self.mapView.selectAnnotation(self.mapView.annotations[row], animated: true)
    }

我尝试过实现这个,但没有任何成功...

func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {

let sortedNames = self.mapView.annotations.sorted(by: {$0.title < $1.title})
        return sortedNames[row].title ?? "No title"

    }

我遇到了这个错误:

无法转换“String??”类型的值到预期的参数类型 'UIContentSizeCategory'

任何提示将不胜感激。

【问题讨论】:

  • 为什么不只对用于创建注释的名称列表进行排序,而不是尝试对注释进行排序?值得指出的是,sortedNames 实际上是一个按标题排序的MKMapAnnotation 数组。如果你真的需要这样做,你可以把它变成这样的字符串数组:let sortedNames = self.mapView.annotations.sorted(by: {$0.title &lt; $1.title}).flatMap({ $0.title })
  • 对于选择器中的每一行按字母顺序对整个列表进行排序似乎也不是很聪明。为什么不只维护一个标题列表,以便您可以排序一次,然后在为您的选择器获取标题时继续访问该列表?
  • 因为每次注解的顺序都变了,所以我提出了注解的请求……我只有25个注解。

标签: swift annotations mapkit mkannotation


【解决方案1】:

我知道这个问题回答起来有点老了,但对于其他有问题的人来说,问题是字符串不能是可选的。修复它以提供默认值或强制打开它。例如,这将是问题的一种解决方案:

let sortedNames = self.mapView.annotations.sorted(by: { ($0.title ?? "") < ($1.title ?? "") }))
return sortedNames[row].title ?? "No title"

【讨论】:

  • 就是这样,兄弟!像魅力一样工作?)+1
  • 没有工作...仍然是这个错误Binary operator '&lt;' cannot be applied to two 'String?' operands
  • @KeghamK。这意味着它们仍然是可选的字符串。您需要提供一个默认值,它将它们从“字符串?”进入“字符串”。这将允许您将它们与二元运算符进行比较。
  • @JackHopkins 发现了这个问题。 MKAnnotation.title的类型是String??,它是一个嵌套的Optional,所以需要可选绑定两次。 stackoverflow.com/questions/52605162/…
【解决方案2】:

在尝试通过字符串属性对不同类的数组进行排序时,我刚刚遇到了这个错误。问题似乎是您排序的属性是可选的。使用非可选属性按预期工作,使用可选属性会产生有点奇怪的“UIContentSizeCategory”错误。

这样的事情应该可以满足您的需要:

   let sorted = self.mapView.annotations { (a1, a2) -> Bool in
            if let s1 = a1.title {
                if let s2 = a2.title {
                    return s1 > s2
                }
            }
            return false
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2015-05-17
    • 2018-03-09
    • 1970-01-01
    • 2010-12-12
    • 2019-06-15
    • 1970-01-01
    相关资源
    最近更新 更多