按副标题排序 tableview 单元格

Posted

技术标签:

【中文标题】按副标题排序 tableview 单元格【英文标题】:Order the tableview cell by the subtitle 【发布时间】:2012-01-11 14:58:49 【问题描述】:

我得到这样的 2 个点的距离

[userLocation distanceFromLocation: annotationLocation] / 1000;

并将其设置为 tableview 的副标题,如下图所示

问题是,我可以按距离(副标题)订购这张桌子吗?

谢谢!

抱歉英语不好=x

【问题讨论】:

Douglas,您最终使用了哪种解决方案?你在使用 CoreData 吗? ferostar 解决方案适合我。我正在使用 .plist 文件。 userlocation 和 annotationLocation 都是 CLLocation。所以我使用 -initWithLatitude:longitude: 和 -distanceFromLocation: 来获取距离并在 NSArray 上对其进行排序。 也许最好是聊天,但我有一系列带纬度和经度的位置。我计算从 userLocation 到每个位置的距离。所以我有了所有的数据,那么我在新数组中放了什么?这里:***.com/questions/14845434/… 【参考方案1】:

您可以以任何方式对 UITableView 的单元格进行排序,但您必须在创建表格的数据源时在显示它们之前执行此操作。如果您使用 NSFetchResultsController,您可以将距离作为排序描述符。如果您使用的是简单的 NS(Mutable)Array,请在将其作为表的源之前对其进行排序。

就像克里斯说的,你可以做到的

NSSortDescriptor *titleSorter= [[NSSortDescriptor alloc] initWithKey:@"annotationLocation" ascending:YES];

如果你使用的是 NSArray,那么:

[arrayOfObjects sortUsingDescriptors:[NSArray arrayWithObject:titleSorter];

如果是 NSFetchResultsController:

NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:titleSorter, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

【讨论】:

但 annotationLocation 不在数据库中。我有经纬度。【参考方案2】:

创建一个 NSSortDescriptor 来对你的行进行排序:

NSSortDescriptor *titleSorter= [[NSSortDescriptor alloc] initWithKey:@"annotationLocation" ascending:YES];
[arrayOfObjects sortUsingDescriptors:[NSArray arrayWithObject:titleSorter];

【讨论】:

【参考方案3】:

用这些距离制作一个数组,按照你想要的方式排序

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
static NSString *cellIdentifier = @"cellIdentifier";
    UITableViewCell *_cell = [self.tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (_cell == nil) 
        _cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier] autorelease];
    
    _cell.textLabel.text = @"Transcripts";
    _cell.detailTextLabel.text = [yourArray objectAtIndex:indexPath.row];
    return _cell;

嗯,这样的事情应该可以解决问题。

希望对你有帮助

【讨论】:

在我的 CD 数据库中,我只有纬度和经度。当前位置按日期排序,如下所示: self.dates = [self.managedObjectContext executeFetchRequest:request error:&error]; `【参考方案4】:

假设您有一些特定的对象持有一个坐标并将这些对象放入一个数组位置,您可以通过执行以下操作来使用比较器块:

locations = [locations sortedArrayUsingComparator: ^(id a, id b) 

    CLLocationDistance dist_a= [[a objectsForKey:@"coordinate"] distanceFromLocation: userPosition];
    CLLocationDistance dist_b= [[b objectsForKey:@"coordinate"] distanceFromLocation: userPosition];
    if ( dist_a < dist_b ) 
        return (NSComparisonResult)NSOrderedAscending;
     else if ( dist_a > dist_b) 
        return (NSComparisonResult)NSOrderedDescending;
     else 
        return (NSComparisonResult)NSOrderedSame;
    

您将此代码添加到您的 viewWillAppear: 以在每次显示 tableView 时获取更新的位置。

【讨论】:

以上是关于按副标题排序 tableview 单元格的主要内容,如果未能解决你的问题,请参考以下文章

按计算距离排序 UITableView 单元格

Swift:Tableview 中特定单元格中的 addSublayer 不是每个单元格

无法重新排序 tableView 单元格图像

使用 NSCoding 保存 TableView 单元格的重新排序

swift 3 ios tableview按单元格滚动

如何对tableView中的单元格进行排序?