#objective-c #uitableview #multidimensional-array
#objective-c #uitableview #многомерный массив
Вопрос:
Я знаю основную идею использования массивов с cellForRowAtIndexPath с использованием indexPath и row, но я не уверен в наилучшем способе просмотра 2D-массива. Я создал пользовательскую ячейку, которая принимает 7 разных строк в 7 держателях, и я создал 2D-массив, который содержит 3 строки по 7 строк. (2D-массив 3×7). Есть предложения о том, как настроить cellForRowAtIndexPath для автоматического прохождения по этому массиву?
Позвольте мне углубиться в подробности. Мой многомерный массив представляет собой массив массивов, которые содержат 7 строк: («Картофель», «0», «1», «2», «3», «4», «5») Вся моя пользовательская ячейка настроена на 7 подвидов (они работают, я тестировал это с массивом). В том же классе, в котором я создаю пользовательскую ячейку, я создал метод, который присваивает значения из тестового массива этим подвидам:
- (void)setMyArray:(NSArray *)myArray
{
NSString *name = [myArray objectAtIndex:0];
[nameLabel setText:name];
[name release];
NSString *numberA = [myArray objectAtIndex:1];
[aLabel setText:numberA];
[numberA release];
NSString *numberB = [myArray objectAtIndex:2];
[bLabel setText:numberB];
[numberB release];
NSString *numberC = [myArray objectAtIndex:3];
[cLabel setText:numberC];
[numberC release];
NSString *numberD = [myArray objectAtIndex:4];
[dLabel setText:numberD];
[numberD release];
NSString *numberE = [myArray objectAtIndex:5];
[eLabel setText:numberE];
[numberE release];
NSString *numberF = [myArray objectAtIndex:6];
[fLabel setText:numberF];
[numberF release];
}
В ViewController все, что мне нужно вызвать, это:
[cell setMyArray:testList];
И это работает. Я просто не уверен, как это сделать с 2D-массивом.
Комментарии:
1. Это будет зависеть от того, как вы настроили свой 2D-массив.
2. В конечном итоге вышеуказанное приведет к сбою. Вы чрезмерно освобождаете каждый элемент в своем массиве. Вызов
-objectAtIndex:
не является выделением, копированием или сохранением, поэтому вы не должны вызыватьrelease
результат.
Ответ №1:
Я не знаю, как именно выглядит ваш пользовательский код ячейки, но не могли бы вы просто сделать:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
if (cell == nil) {
//...
}
[cell setMyArray:[self.myTwoDArray objectAtIndex:indexPath.row]];
// and so on...
Кроме того, Роб прав насчет вашего управления памятью. Не освобождайте объекты, когда вы извлекаете их из исходного массива.
Комментарии:
1. Спасибо, Роб, за советы по управлению памятью. И да, ты был прав, Джош, твой код отлично работает. С помощью некоторых NSLogs я выяснил, что мой setMyArray отлично работал и не нуждался во втором objectAtIndex. Каждый раз он получал массив. Еще раз спасибо, ребята.
2.
NSArray
Внутри другого все еще остаетсяNSArray
, так что это то, что вы получаете, когда проситеobjectAtIndex:
Рад, что смог помочь!