NSMutableDictionary и NSArray

#objective-c #uitableview #nsarray #nsmutabledictionary

#objective-c #uitableview #nsarray #nsmutabledictionary

Вопрос:

Я разбиваю строку:

 @"Sam|26|Developer,Hannah|22|Team Leader,Max|1|Dog"
  

и использование NSMutableDictionary для отображения в tableViewCell с 3 метками. Код:

 - (void)viewDidLoad {
    [super viewDidLoad];

NSString *test = @"Sam Parrish|26|Developer,Hannah Rajamets|22|Team Leader,Max Parrish|1|Dog";

testArray = [[NSArray alloc] init];
testArray = [test componentsSeparatedByString:@","];

dict = [NSMutableDictionary dictionary];
    for (NSString *s in testArray) {

        testArrayNew = [s componentsSeparatedByString:@"|"];
        [dict setObject:[testArrayNew objectAtIndex:1] forKey:[testArrayNew objectAtIndex:0]];
        [dict setObject:[testArrayNew objectAtIndex:2] forKey:[testArrayNew objectAtIndex:1]];

        NSLog(@"Dictionary: %@", [dict description]);
    }

[dict retain];

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [[dict allKeys] count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"CustomCell";

    untitled *cell = (untitled *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {

        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"untitled" owner:nil options:nil];

        for (id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                cell = (untitled *) currentObject;
                break;
            }
        }
    }

    // Configure the cell.
    cell.nameLabel.text = [[dict allKeys] objectAtIndex:[indexPath row]];
    cell.ageLabel.text = [dict objectForKey:cell.nameLabel.text];
    cell.jobLabel.text = [dict objectForKey:cell.ageLabel.text];

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

    return cell;
}
  

при запуске отображается 6 ячеек TableViewCells, 3 из которых идеальны, остальные 3 представляют собой набор данных. я понимаю, что это связано с setObject: forKey: , но, похоже, не могу найти решение, чтобы это работало правильно.

любая помощь высоко ценится..

сэм

Комментарии:

1. Где вы создаете testArray ?

2. извините, я пропустил этот фрагмент при вырезании и вставке — теперь он там

3. Ваш способ установки ключей в dictionary меня удивляет. 🙂 Почему вы используете этот способ? Есть ли у вас какая-то конкретная причина поступать подобным образом?

Ответ №1:

Я бы сохранил данные как NSArray, содержащий NSArrays….

 - (void)viewDidLoad {
        [super viewDidLoad];

        NSString *test = @"Sam Parrish|26|Developer,Hannah Rajamets|22|Team Leader,Max Parrish|1|Dog";

        data = [[NSMutableArray alloc] init];

        for (NSString *s in testArray) {
            [data addObject:[s componentsSeparatedByString:@"|"]];
        }
}
  

Затем в

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

использовать

 // Configure the cell.
NSArray *cellData = [data objectAtIndex:indexPath.row];
cell.nameLabel.text = [cellData objectAtIndex:0];
cell.ageLabel.text = [cellData objectAtIndex:1];
cell.jobLabel.text = [cellData objectAtIndex:2];
  

Комментарии:

1. данные — это, кстати, NSMutableArray.

2. У вас есть данные в массиве и дочерних массивах …. нет причин, по которым этот код не будет работать, и это правильный способ справиться с тем, что вы хотите сделать.

3. аааа, вам также нужен — (NSInteger)TableView:(UITableView *)TableView numberOfRowsInSection:(NSInteger)раздел { return [количество данных]; }

4. Кстати, это лучший комментарий, который я видел на SO на сегодняшний день. 🙂

Ответ №2:

Если я вас правильно понял, вы говорите, что первые три ячейки правильные, а остальные три вообще не должны отображаться? Если это так, то проблема заключается в следующем:

 return [[dict allKeys] count];
  

Разве это не должно быть…

 return [testArray count];
  

…в этом случае вам необходимо сохранить testArray .

Кроме того, у вас произошла утечка памяти. Вы создаете экземпляр NSArray , затем вы немедленно сливаете его, присваивая возвращаемое значение componentsSeparatedByString: той же переменной. Вы запускали статический анализатор над своим кодом?

Комментарии:

1. это не первые 3 ячейки, которые являются правильными, они расположены в случайном порядке, и правильные ячейки размещаются на 3-м, 4-м и 5-м местах. Как я уже сказал, я думаю, это из-за setObject: и forKey: code, поскольку я, похоже, устанавливаю ключ для объекта, поэтому он создает больше ячеек

2. может ли NSMutableDictionary показывать подобное… Sam => 26 => разработчик?

3. как это происходит на данный момент… 1 = Собака; 22 = «Руководитель группы»; 26 = Разработчик; «Ханна Раджаметс» = 22; «Макс Пэрриш» = 1; «Сэм Пэрриш» = 26;