#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;