Справка с массивом словарей в виде таблицы - PullRequest
0 голосов
/ 29 июля 2010

Это немного сбивает с толку, поэтому, пожалуйста, потерпите меня.

У меня есть массив (listOfStates) словарей.Где listOfStates имеет такую ​​структуру:

{stateName} - {stateCapital}
{Alabama} - {Montgomery}
{Alaska} - {Juneau}
{Arizona} - {Phoenix}
...
{West Virginia} - {Charleston}
{Wisconsin} - {Madison}
{Wyoming} - {Cheyenne}

Этот код используется для получения 1-й буквы каждого штата США (stateName) для группировки их по алфавиту:

listOfStates = [[NSArray alloc] init];  
stateIndex = [[NSMutableArray alloc] init];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];

for (NSDictionary *row in listOfStates) {
    [tempArray addObject:[row valueForKey:@"stateName"]];

     for (int i=0; i<[tempArray count]-1; i++){
     char alphabet = [[tempArray objectAtIndex:i] characterAtIndex:0];
     NSString *uniChar = [NSString stringWithFormat:@"%C", alphabet];
         if (![stateIndex containsObject:uniChar]){  
             [stateIndex addObject:uniChar];
         }
     }
}

Токод работает прекрасно, однако у меня возникают проблемы с пониманием того, как заполнить ячейку табличного представления ОБА @ "stateName" и @ "stateCapital" (в качестве субтитра) после того, как я использую NSPredicate для сортировки массива.

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

static NSString *CellIdentifier = @"Cell";

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
    //---get the letter in the current section---
NSString *alphabet = [stateIndex objectAtIndex:[indexPath section]];

    //---get all states beginning with the letter---
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];
NSArray *states = [[listOfStates valueForKey:@"stateName"] filteredArrayUsingPredicate:predicate];

        //---extract the relevant state from the states object---
    cell.textLabel.text = [states objectAtIndex:indexPath.row];
        //cell.textLabel.text = [[listOfStates objectAtIndex:indexPath.row] objectForKey:@"stateName"];
        //cell.detailTextLabel.text = [[listOfStates objectAtIndex:indexPath.row] objectForKey:@"stateCapital"];

return cell;
}

Любая помощь приветствуется, и я более чем готов отправить весь проект, если вы считаете, что он поможет вам понять.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 29 июля 2010
cell.textLabel.text = [[states objectAtIndex:indexPath.row] objectForKey:@"stateName"];
cell.detailTextLabel.text =[states objectAtIndex:indexPath.row] objectForKey:@"stateCapital"];

Обновление:

К сожалению, только массив 'states' включает названия штатов ...

Изменить предикат и фильтр на:

NSPredicate *p=[NSPredicate predicateWithFormat:@"stateName beginswith[c] %@", alphabet];
NSArray *states=[listOfStates filteredArrayUsingPredicate:p];

... это даст вам массив состояний, которые начинаются с одной буквы. Затем вы можете отсортировать массив и строка даст вам правильный словарь состояния.

0 голосов
/ 30 июля 2010

Возможно, измените структуру данных, чтобы у вас был один словарь с именем штата в качестве ключа и капиталом штата в качестве значения.Таким образом, вы можете отсортировать ключи и получить значение, используя ключи, а не индексы.

...