NSMutableDictionary и NSArray - PullRequest
       17

NSMutableDictionary и NSArray

0 голосов
/ 10 июня 2011

Я разделяю строку:

@"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 ячеек TableViewCell, 3 из которых являются идеальными, остальные 3 представляют собой набор данных. я понимаю, что это связано с setObject: forKey:, но, похоже, не могу найти решение, чтобы это работало правильно.

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

1012 * сэм *

Ответы [ 2 ]

0 голосов
/ 10 июня 2011

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

return [[dict allKeys] count];

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

return [testArray count];

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

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

0 голосов
/ 10 июня 2011

Я бы сохранил данные как 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];
...