Objective C использует 2D-массивы с cellForRowAtIndexPath

#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: Рад, что смог помочь!