如何按 UITableViewCell 的字母顺序对对象进行排序?
How to Sort object by alphabet order for UITableViewCell?
我想对我在 NSMutableArray
中创建并存储在 AppDelegate.m
中的对象进行排序。
站数是 NSObject
Class
我想在另一个 UIViewController
中按字母顺序显示站点名称(在 UITableViewCell
中)& 当我点击它们时,我想将包含站点名称、纬度、经度的对象传递给下一个 UIViewController
目前我已经将站名从 stationList(Global NSMutableArray
) 提取到 UIViewController
s Cell 上的另一个 NSMutableArray,并通过
对其进行排序
[sortedArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
但是当调用 didSelectRowAtIndexPath 时,我必须从单元格中获取此名称并在 stationList 数组中搜索它以传递经纬度,我认为这不太好。
stationList数组日志(有100个对象):-
<__NSArrayM 0x79a2f110>(
<Stations: 0x78743540>,
<Stations: 0x78743630>,
<Stations: 0x78743670>,
<Stations: 0x78743750>,
<Stations: 0x78743830>,
<Stations: 0x78743910>,
<Stations: 0x78743a10>,
<Stations: 0x78743af0>
}
-(void)loadStations
{
stationList = [[NSMutableArray alloc]init];
NSString *path = [[NSBundle mainBundle] pathForResource:@"stations" ofType:@"txt"];
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"%@",content);
NSArray *tempArr = [content componentsSeparatedByString:@"\n"];
for (int i =0; i<[tempArr count]; i++)
{
NSString *rawData = [tempArr objectAtIndex:i];
if (rawData !=nil)
{
Stations *newStation = [[Stations alloc]init];
NSArray *data = [rawData componentsSeparatedByString:@"\t"];
newStation.sId = i+1;
newStation.name = [NSString stringWithFormat:@"%@",[data objectAtIndex:0]];
newStation.latitude = [[data objectAtIndex:1] doubleValue];
newStation.longitude = [[data objectAtIndex:2] doubleValue];
[stationList addObject:newStation];
}
}
}
建议我好practice/way,或者使用字典?
我在这里看到两个解决方案:
1) 您可以根据 indexPath.row
从 stationList
中检索对象
- (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
Stations* station = stationsList[indexPath.row];
...
}
2) 您可以创建自定义 UITableViewCell
并在其中存储引用对象:
@interface StationCell : UITableVIewCell
@property(weak) Stations* station;
@end
...
- (UITableViewCell*) tableView:(UITableVIew*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
StationCell* cell;
// dequeue StationCell
...
cell.station = stationList[indexPath.row];
}
...
- (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
StationCell* cell = [tableView cellAtIndexPath:indexPath];
Stations* station = cell.station;
...
}
我会根据单元格中显示的数据的复杂性在解决方案之间进行选择 - 使用自定义 UITableViewCell
提供了将单元格配置从视图控制器移动到单元格实现的机会。
编辑
至于排序stationsList
,你可以使用例如:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
stationsList = [stationsList sortedArrayUsingDescriptors:@[sort]];
我建议不要将站点名称数组与数组 stationList 分开排序。相反,我建议对您的 stationList 进行排序(或者如果您只想更改 table 视图中的顺序并需要在其他地方维护一些其他顺序,则可以对它的副本进行排序)
有像 sortUsingComparator: 这样的方法将比较器块作为参数。您编写了一个块来比较数组中的 2 个元素,该方法使用该块来确定对象的顺序并对数组进行排序。在您的情况下,只需编写一个块来比较 2 个站对象的名称属性。
我想对我在 NSMutableArray
中创建并存储在 AppDelegate.m
中的对象进行排序。
站数是 NSObject
Class
我想在另一个 UIViewController
中按字母顺序显示站点名称(在 UITableViewCell
中)& 当我点击它们时,我想将包含站点名称、纬度、经度的对象传递给下一个 UIViewController
目前我已经将站名从 stationList(Global NSMutableArray
) 提取到 UIViewController
s Cell 上的另一个 NSMutableArray,并通过
[sortedArray sortUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
但是当调用 didSelectRowAtIndexPath 时,我必须从单元格中获取此名称并在 stationList 数组中搜索它以传递经纬度,我认为这不太好。
stationList数组日志(有100个对象):-
<__NSArrayM 0x79a2f110>(
<Stations: 0x78743540>,
<Stations: 0x78743630>,
<Stations: 0x78743670>,
<Stations: 0x78743750>,
<Stations: 0x78743830>,
<Stations: 0x78743910>,
<Stations: 0x78743a10>,
<Stations: 0x78743af0>
}
-(void)loadStations
{
stationList = [[NSMutableArray alloc]init];
NSString *path = [[NSBundle mainBundle] pathForResource:@"stations" ofType:@"txt"];
NSString *content = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"%@",content);
NSArray *tempArr = [content componentsSeparatedByString:@"\n"];
for (int i =0; i<[tempArr count]; i++)
{
NSString *rawData = [tempArr objectAtIndex:i];
if (rawData !=nil)
{
Stations *newStation = [[Stations alloc]init];
NSArray *data = [rawData componentsSeparatedByString:@"\t"];
newStation.sId = i+1;
newStation.name = [NSString stringWithFormat:@"%@",[data objectAtIndex:0]];
newStation.latitude = [[data objectAtIndex:1] doubleValue];
newStation.longitude = [[data objectAtIndex:2] doubleValue];
[stationList addObject:newStation];
}
}
}
建议我好practice/way,或者使用字典?
我在这里看到两个解决方案:
1) 您可以根据 indexPath.row
stationList
中检索对象
- (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
Stations* station = stationsList[indexPath.row];
...
}
2) 您可以创建自定义 UITableViewCell
并在其中存储引用对象:
@interface StationCell : UITableVIewCell
@property(weak) Stations* station;
@end
...
- (UITableViewCell*) tableView:(UITableVIew*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
StationCell* cell;
// dequeue StationCell
...
cell.station = stationList[indexPath.row];
}
...
- (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
StationCell* cell = [tableView cellAtIndexPath:indexPath];
Stations* station = cell.station;
...
}
我会根据单元格中显示的数据的复杂性在解决方案之间进行选择 - 使用自定义 UITableViewCell
提供了将单元格配置从视图控制器移动到单元格实现的机会。
编辑
至于排序stationsList
,你可以使用例如:
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
stationsList = [stationsList sortedArrayUsingDescriptors:@[sort]];
我建议不要将站点名称数组与数组 stationList 分开排序。相反,我建议对您的 stationList 进行排序(或者如果您只想更改 table 视图中的顺序并需要在其他地方维护一些其他顺序,则可以对它的副本进行排序)
有像 sortUsingComparator: 这样的方法将比较器块作为参数。您编写了一个块来比较数组中的 2 个元素,该方法使用该块来确定对象的顺序并对数组进行排序。在您的情况下,只需编写一个块来比较 2 个站对象的名称属性。