按距离排序/订购UITableView

时间:2013-10-16 22:08:54

标签: ios objective-c uitableview

我使用plist使用以下代码填充UITableView:

NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"Items" ofType:@"plist"];
NSDictionary *itemDictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.itemList = itemDictionary[@"List of Items"];

plist看起来像这样:

<key>List of Items</key>
<array>
    <<dict>
        <key>Name</key>
        <string>Name of Item 1</string>
        <key>Description</key>
        <string>Description of Item 1</string>
        <key>Latitude</key>
        <integer>0</integer>
        <key>Longitude</key>
        <integer>0</integer>
    </dict>
    <dict>
        <key>Name</key>
        <string>Name of Item 2</string>
        <key>Description</key>
        <string>Description of Item 2</string>
        <key>Latitude</key>
        <integer>0</integer>
        <key>Longitude</key>
        <integer>0</integer>
    </dict>

我可以使用以下方法设置单元格中每个项目的标题和副标题(距坐标的距离):

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

            cell.textLabel.text = self.itemList[indexPath.row][@"Name"];
            CLLocation *itemLoc = [[CLLocation alloc] initWithLatitude:[self.itemList[indexPath.row][@"Latitude"] doubleValue]
                                                           longitude:[self.itemList[indexPath.row][@"Longitude"] doubleValue]];
            CLLocationDistance itemDistance = [itemLoc distanceFromLocation:currentLocation];
            cell.detailTextLabel.text = [[NSString alloc] initWithFormat: @"%.f metres", itemDistance];
return cell;
 }

但是,我想按最近的位置(项目)对表格视图进行排序/排序。这可以通过使用itemDistance浮点值或整个detailTextLabel.text来完成,但我不知道如何实现它。

3 个答案:

答案 0 :(得分:3)

在UITableView上填充之前预先计算itemDistance;

for(int i=0; i< [self.itemList count]; i++)
{
    NSDictionary *dict [self.itemList objectAtIndex:i];  
    CLLocation *itemLoc = [[CLLocation alloc] initWithLatitude:[self.itemList[i][@"Latitude"] doubleValue]
                                                       longitude:[self.itemList[i][@"Longitude"] doubleValue]];
    CLLocationDistance itemDistance = [itemLoc distanceFromLocation:currentLocation];
[dict setObject:[NSNumber numberWithDouble: itemDistance] forKey:@"itemDistance"];

}

   NSSortDescriptor *sortByName = [NSSortDescriptor sortDescriptorWithKey:@"itemDistance"
ascending:YES];
  NSArray *sortDescriptors = [NSArray arrayWithObject:sortByName];
  NSArray *sortedArray = [self.itemList sortedArrayUsingDescriptors:sortDescriptors];

然后在UITableView上加载sortedArray。 Plz注意到我没有编译代码。

答案 1 :(得分:1)

您不能简单地根据tableviewcells中包含的数据对tableview进行排序(仅存在可见的tableview单元格)。您必须对表视图的数据源进行排序,在您的情况下是self.itemList。创建一个新方法,计算self.itemList中每个项目的距离,然后根据该距离对self.itemList进行排序,或者创建一个带有排序值的新数组。如果您希望按该值排序,请不要计算cellforrowatindexpath方法中的距离。

答案 2 :(得分:0)

试着看看'NSSortDiscriptor'。

样品:

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];