我使用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
来完成,但我不知道如何实现它。
答案 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];