1

我正在使用 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但我不知道如何实现这一点。

4

3 回答 3

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。请注意,我还没有编译代码。

于 2013-10-16T22:58:26.323 回答
1

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

于 2013-10-16T22:16:48.377 回答
0

试着看看'NSSortDiscriptor'。

样本:

NSSortDescriptor *ageDescriptor = [[NSSortDescriptor alloc] initWithKey:@"age" ascending:YES];
NSArray *sortDescriptors = @[ageDescriptor];
NSArray *sortedArray = [employeesArray sortedArrayUsingDescriptors:sortDescriptors];
于 2013-10-16T22:17:34.307 回答