Два NSMutableArrays в одном UITableView с пользовательскими ячейками в iOS

#ios #objective-c #uitableview #nsmutablearray

#iOS #objective-c #uitableview #nsmutablearray

Вопрос:

В моем приложении для iOS у меня два NSMutableArray

 @implementation MyViewController {
    NSMutableArray *arrOne;
    NSMutableArray *arrTwo;
}
  

объявлено в моем файле реализации и один UITableView

 @property (strong, nonatomic) IBOutlet UITableView *tableView;
  

объявлено внутри MyController.h

Я хочу загрузить оба содержимого этого массива в ту же таблицу, где сначала arrOne content, а затем arrTwo contants.

Ниже показано, как я получил количество строк таблицы

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{   
    if ([arrOne count] > 0 amp;amp; [arrTwo count] > 0) {
        return [arrOne count]   [arrTwo count];
    } else if ([arrTwo count] > 0) {
        return [arrTwo count];
    } else {
        return 10;
    }
}
  

и ниже приведено место, где я пытался создать ячейки своей таблицы

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"myTable";

    if ([arrOne count] > 0 amp;amp; [arrOne count] > indexPath.row) {

        UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (defaultCell == nil) {
            defaultCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
        }       
        return defaultCell;

    } else {

        MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

        if (cell == nil)
        {
            NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil];
            cell = [nib objectAtIndex:0];
        }
        return cell;
    }
}
  

С помощью приведенного выше кода и предположим, что у arrOne есть только один элемент, TableView должен отображать первую ячейку белым цветом, а все остальные — с моей пользовательской ячейкой. Вместо этого отображается первая ячейка белого цвета, как и ожидалось, и снова несколько ячеек в середине (5, 9, 13 …) также белого цвета. Пока не могу определить причину. Есть идеи, почему?

Если это неправильный способ реализации двух массивов в одном табличном представлении, что это?

Ответ №1:

Если arrOne содержит только один элемент (как вы говорите) и arrTwo пуст, тогда у вас будет всего 10 ячеек в соответствии с numberOfRowsInSection . Первая ячейка будет UITableViewCellStyleDefault ячейкой, а следующие 9 должны быть MyTableViewCell ячейками.

Причина, по которой вы видите несколько UITableViewCellStyleDefault ячеек, заключается в том, что вы используете один и тот же идентификатор ячейки. Переместите объявление идентификатора внутри каждого из операторов if / else и используйте другой идентификатор для каждого типа ячейки.

 if ([arrOne count] > 0 amp;amp; [arrOne count] > indexPath.row) {
    static NSString *defaultTableIdentifier = @"defaultReuse";
    UITableViewCell *defaultCell = [tableView dequeueReusableCellWithIdentifier:defaultTableIdentifier];

    if (defaultCell == nil) {
        defaultCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:defaultTableIdentifier];
    }       
    return defaultCell;

} else {
    static NSString *simpleTableIdentifier = @"myCustomCellReuse";
    MyTableViewCell *cell = (MyTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MyTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    return cell;
}
  

(Кроме того, отличается ли ваше имя пера от имени класса? MyTableViewCell против MyTableCell . Потому что вы объявляете ячейку класса MyTableViewCell , а затем загружаете имя MyTableCell файла.)

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

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