gpt4 book ai didi

ios - 按键排序基于 NSDictionary 的 UITableView

转载 作者:行者123 更新时间:2023-11-29 13:37:05 25 4
gpt4 key购买 nike

我有一个自定义的 UITableView,它由带入 NSMutableDictionary 的 JSON 数据填充。然后我创建一个 mutablecopy,以便我可以将 distanceFromLocation 方法的值添加到字典中。我想要做的是然后使用该新对象按最近的距离对单元格进行排序。我看过其他使用 NSSortDescriptor 的示例,但那是在谈论对数组进行排序。如何从字典中对单元格进行排序或从字典中创建数组以使用 NSSortDescriptor?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

static NSString *CellIdentifier = @"dealerlistcell";

DealerListCell *cell = (DealerListCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[DealerListCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
}

//gets JSON data and loads into Dictionary
NSMutableDictionary *info = [json objectAtIndex:indexPath.row];
NSMutableDictionary *infocopy = [info mutableCopy];

//pulls the current user location
CLLocation *currentlocation2 = [[CLLocation alloc] initWithLatitude:locationManager.location.coordinate.latitude longitude:locationManager.location.coordinate.longitude];

//gets the latitude and longitude from info dictionary to calculate distancefromlocation for each cell
CLLocation *locationforindex = [[CLLocation alloc] initWithLatitude:[[info objectForKey:@"dlrlat"]doubleValue] longitude:[[info objectForKey:@"dlrlong"]doubleValue]];

//calculates the distance
CLLocationDistance dist = ([locationforindex distanceFromLocation:currentlocation2]*0.0006213711922);

//format the distance to a string for the label
NSString *distancestring = [NSString stringWithFormat:@"%.1f miles",dist];

//create object with distance to add to dictionary
NSNumber *distance = [NSNumber numberWithDouble:dist];

编辑:分配给对象的距离,稍后在 NSSortDescriptor 中调用

//add to dictionary 
[infocopy setObject:distance forKey:@"distance"];

//create array from dictionary
NSDictionary *aDict = [NSDictionary dictionaryWithDictionary:infocopy];
NSArray *anArray = [aDict allValues];

//implemented NSSortDescriptor
NSSortDescriptor *sorter [[NSSortDescriptor alloc] initWithKey:@"distance" ascending: YES];
NSArray *sortdescriptors = [NSArray arrayWithObject:sorter];
[anArray sortedArrayUsingDescriptors:sortdescriptors];

但是它会为键距离抛出 valueForUndefinedKey。如何在“initWithKey”中定义距离键?

最佳答案

在这个论坛和我 friend 的帮助下,我能够将这个解决方案拼凑起来。

答案是使用 for 循环并在加载 TableView 之前为方法中的每个位置创建字典。然后我使用 NSSortDescriptor 进行排序,并且效果很好。

最终解决方案见下面的代码。

-(void)getData:(NSData *) data 
{

NSError *error;

// load the jsonArray with the JSON Data
jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];


//define the unsorted dealers array
unsortedDealers = [[NSMutableArray alloc] initWithCapacity:1000];

// start at row 0
int index = 0;

// loop through each dealer and calculate distance from current location
for (NSDictionary *dealer in jsonArray)
{
//create dictionary from JSON Array
infoDict = [jsonArray objectAtIndex:index];

//get the coordidates from current location
CLLocation *currentlocation = [[CLLocation alloc] initWithLatitude:locationManager.location.coordinate.latitude longitude:locationManager.location.coordinate.longitude];

//get the coordinates for dealer at row
// dlr lat and longs are switched in the database
CLLocation *locationforindex = [[CLLocation alloc] initWithLatitude:[[infoDict objectForKey:@"dlrlong"]doubleValue] longitude:[[infoDict objectForKey:@"dlrlat"]doubleValue]];

//calculate the distance from current location to dealer at row and format it in miles
CLLocationDistance dist = ([locationforindex distanceFromLocation:currentlocation]*0.0006213711922);

//define the distance for display
NSNumber *distanceForDict = [NSNumber numberWithDouble:dist];

//define the distance for sorting
NSString *distanceForSort = [NSString stringWithFormat:@"%.1f",dist];

//create a dictionary for each dealer and define the values for each key
NSMutableDictionary *dealerDict = [[NSMutableDictionary alloc] initWithObjectsAndKeys:[infoDict objectForKey:@"dlrname"] , @"dlrname", [infoDict objectForKey:@"dlrcity"], @"dlrcity", [infoDict objectForKey:@"dlrstate"] , @"dlrstate", [infoDict objectForKey:@"dlrzip"], @"dlrzip", [infoDict objectForKey:@"dlradd"] , @"dlradd", distanceForDict , @"dlrdistance" , distanceForSort , @"dlrsortdistance" , [infoDict objectForKey:@"dlremail"] , @"dlremail" , [infoDict objectForKey:@"dlrfax"] , @"dlrfax" , [infoDict objectForKey:@"dlrhours"] , @"dlrhours" , [infoDict objectForKey:@"dlrlat"], @"dlrlat",[infoDict objectForKey:@"dlrlong"] , @"dlrlong" , [infoDict objectForKey:@"dlrnum"], @"dlrnum",[infoDict objectForKey:@"dlrphone"] , @"dlrphone" , [infoDict objectForKey:@"dlrwebsite"], @"dlrwebsite", nil];

//add dictionary to the unsorted array
[unsortedDealers addObject:dealerDict];

// iterate through the list of dealers
++index;

}

// creates the sorting element
NSSortDescriptor *sortDescriptor;

//define what you want to sort by
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"dlrdistance" ascending:YES];

// build new array with thosed elements to be sorted
NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

// create new array based on the sorted value
sortedDealers = [unsortedDealers sortedArrayUsingDescriptors:sortDescriptors];

[self.tableView reloadData];

//error message if there is no data found. Usually this is an error with the connection,
//it should never return empty
if (jsonArray == nil)
{
NSLog(@"No Data Loaded. Please check your internet connection");
}

关于ios - 按键排序基于 NSDictionary 的 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10304062/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com