【问题标题】:Display Sorted Result on a Table - Swift4在表格上显示排序结果 - Swift4
【发布时间】:2018-11-06 19:58:02
【问题描述】:

我有

包含这些内容的地方

print(places)

Optional(Results<Place> <0x109526f30> (
    [0] Place {
        name = 127 Pine St;
        country = United States;
        lat = 42.63341130000001;
        lon = -71.33169049999999;
    },
    [1] Place {
        name = 138 B St;
        country = United States;
        lat = 42.6285025;
        lon = -71.3288776;
    },
    [2] Place {
        name = 16 Bagley Ave;
        country = United States;
        lat = 42.6344084;
        lon = -71.3378318;
    },
    [3] Place {
        name = 27 Lane St;
        country = United States;
        lat = 42.6346452;
        lon = -71.32436559999999;
    },
    [4] Place {
        name = 39 Cosgrove St;
        country = United States;
        lat = 42.61964890000001;
        lon = -71.3031683;
    },
    [5] Place {
        name = 48 Houghton St;
        country = United States;
        lat = 42.6252232;
        lon = -71.3243308;
    },
    [6] Place {
        name = 49 Coral St;
        country = United States;
        lat = 42.6359846;
        lon = -71.32655780000002;
    },
    [7] Place {
        name = 59 Marriner St;
        country = United States;
        lat = 42.622121;
        lon = -71.31365679999999;
    }
)) <<<

我还有另一个数组,我在内存中维护,看起来像这样

 print(distances)
 ["1.74", "1.45", "2.04", "1.50", "0.00", "1.15", "1.64", "0.56"]

结果

我的最终结果是这样的。


代码

这就是我渲染这张表的方式

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "customPlaceDetailCell", for: indexPath)
     as! CustomPlaceDetailCell

    if selectedPlace.name != nil {

        cell.address.text = (places![indexPath.row]["name"] as! String)
        cell.distance.text = distances[indexPath.row]

        if indexPath.row == activePlace {
            cell.address.isHidden = true
            cell.distance.isHidden = true
        }

    }

    return cell
}

我想要

显示我的结果按距离更近排序


注意:我的距离不是我的场所对象的一部分。我在运行时计算了它们。

如何去做这件事?

【问题讨论】:

  • 使距离成为数据模型的一部分,用于填充表格。你只需要一个数组,而不是两个。
  • 只对数组进行排序?
  • @rmaddy 每个点之间的距离是动态计算的,而不是存储在数据库中。我认为没有必要存储它。
  • 它没有说存储距离。您需要一个用于表格视图的单独数据模型。使用您从数据库加载的数据和您在运行时计算的数据的组合来填充它。
  • 我告诉过你在另一个问题上只使用一个数组:stackoverflow.com/questions/53174828/… 如您所见,如果您对places 进行排序,则需要以相同的方式对distances 进行排序。此外,还有很多关于排序的问题,您没有显示任何尝试。

标签: ios swift uitableview tableview


【解决方案1】:

计算点之间的距离很昂贵。您应该只执行一次,或者如果您的数据发生更改。 排序是昂贵的。您应该只执行一次,或者如果您的数据发生更改。

尝试对 2 个不同的数组进行排序是个坏主意。

排序会多次比较数组中的项目。您需要一个地方来保存距离,以便对您的地方进行排序。

使您的 Place 对象成为具有方法和属性的 Struct,而不是 Dictionary

我会在你的数组中添加一个计算出的距离属性。还要添加一个internalDistance 属性,即Optional

如果计算距离属性的 getter 不为零,则返回 internalDistance,或者计算距离,将其保存到 internalDistance,如果为零则返回。

如果您更改目标点,则循环遍历地点数组并将所有internalDistance 变量清零,然后重新排序地点数组。

【讨论】:

    【解决方案2】:

    这样的事情应该是一种可能性。

    override func viewDidAppear(_ animated : Bool){
    super.viewDidAppear(animated)
     placeArray = zip(places,distance).sorted{$0.1<$1.1}.map{$0.0}
    }
    

    cell.address.text = (placeArray![indexPath.row]["name"] as! String)


    如果你想要另一种可能更快的方法,你可以像这样对距离进行排序:

    placeArray = distance.enumerated().sorted{$0.element&lt;$1.element}.map{places[$0.offset]}

    这需要一种距离作为索引。

    【讨论】:

    • 我试图在两个变量都可用后将它放在我的 viewDidLoad() 中。我得到了这个:i.imgur.com/ZJUGW8s.png
    • Result 可以有一些方法,比如places.array 或places.objects?返回一个数组类型。那是核心数据吗?
    • 让我试试你的第二个;
    • 也许你需要一个 init 方法来转换数组结果,就像更新的那样。
    • 这不是一个好的解决方案。 cellForRow 被多次调用。当您每次只需要一个值时,此代码将让您一次又一次地压缩和排序相同的数据。在开始时创建一个数组。排序一次。那么cellForRow 不需要做任何工作,除了从已经排序的数组中获取它需要的一个特定值。
    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2021-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多