如何按 UITableViewCell 的字母顺序对对象进行排序?

How to Sort object by alphabet order for UITableViewCell?

我想对我在 NSMutableArray 中创建并存储在 AppDelegate.m 中的对象进行排序。 站数是 NSObject Class

我想在另一个 UIViewController 中按字母顺序显示站点名称(在 UITableViewCell 中)& 当我点击它们时,我想将包含站点名称、纬度、经度的对象传递给下一个 UIViewController

目前我已经将站名从 stationList(Global NSMutableArray) 提取到 UIViewControllers 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 个站对象的名称属性。