Проблема UITableViewCell с неверным отображением indexPath.row

#objective-c #xcode #ios #uitableview

#objective-c #xcode #iOS #uitableview

Вопрос:

Я настроил UITableView, в котором есть 3 раздела, по 3 строки в каждом. Я использовал следующий код, чтобы указать, что я хочу, чтобы объекты из определенных массивов отображались в качестве содержимого строки;

     recipeData = [[NSArray alloc] initWithObjects:@"Chicken amp; Veg Rissoto",@"Super Healthy Pizza",@"Salmon Burgers",nil];
    dessertsData = [[NSArray alloc] initWithObjects:@"Raspberry Parfaits",@"ChocNana YumYum",@"Grilled Choc Sandwich",nil];
    beveragesData = [[NSArray alloc] initWithObjects:@"Berry Smoothie",@"Banana Berry Smoothie",@"Cocoa Soy Smoothie",nil];
    [self setTitle:@"Recipe Table"];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 3;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.recipeData count];
    return [self.dessertsData count];
    return [self.beveragesData count];
  

Все это работало нормально, до сегодняшнего вечера, когда я добавил изображения слева от текста в строке. Изображения отображаются идеально, но по какой-то причине все строки заполнены объектами из beveragesData, и это полностью игнорирует два других набора объектов. Ниже приведен код, который я использовал. Я надеюсь, что это что-то такое же простое, как просто неправильное написание инструкций if.

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: SimpleTableIdentifier];

    if (cell == nil) { cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:SimpleTableIdentifier] autorelease];
    }   
    if(indexPath.section == 0) 
        if(indexPath.row == 0)
            [cell.imageView setImage:[UIImage imageNamed:@"Main0.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
    if(indexPath.section == 0) 
        if(indexPath.row == 1)
            [cell.imageView setImage:[UIImage imageNamed:@"Main1.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
    if(indexPath.section == 0)
        if(indexPath.row == 2)
            [cell.imageView setImage:[UIImage imageNamed:@"Main2.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];

   if(indexPath.section == 1)
        if(indexPath.row == 0)
            [cell.imageView setImage:[UIImage imageNamed:@"Dessert0.png"]];
            [cell.textLabel setText:[dessertsData objectAtIndex:indexPath.row]];
    if(indexPath.section == 1)
        if(indexPath.row == 1)
            [cell.imageView setImage:[UIImage imageNamed:@"Dessert1.png"]];
            [cell.textLabel setText:[dessertsData objectAtIndex:indexPath.row]];
    if(indexPath.section == 1)
        if(indexPath.row == 2)
            [cell.imageView setImage:[UIImage imageNamed:@"Dessert2.png"]];
            [cell.textLabel setText:[dessertsData objectAtIndex:indexPath.row]];

   if (indexPath.section == 2)
        if(indexPath.row == 0)
            [cell.imageView setImage:[UIImage imageNamed:@"Drink0.png"]];
            [cell.textLabel setText:[beveragesData objectAtIndex:indexPath.row]];
    if(indexPath.section == 2)
        if(indexPath.row == 1)
            [cell.imageView setImage:[UIImage imageNamed:@"Drink1.png"]];
            [cell.textLabel setText:[beveragesData objectAtIndex:indexPath.row]];
    if(indexPath.section == 2)
        if(indexPath.row == 2)
            [cell.imageView setImage:[UIImage imageNamed:@"Drink2.png"]];
            [cell.textLabel setText:[beveragesData objectAtIndex:indexPath.row]];
    return cell;
  

Итак, в настоящее время, когда это выполняется, все 9 строк UITableView заполняются объектами из beveragesData. Буду признателен за любую помощь.

Спасибо

Ответ №1:

Структура Objective-c не основана на отступах

Это:

 if(indexPath.section == 0) 
        if(indexPath.row == 0)
            [cell.imageView setImage:[UIImage imageNamed:@"Main0.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
  

Должно быть:

 if(indexPath.section == 0) 
        if(indexPath.row == 0) {
            [cell.imageView setImage:[UIImage imageNamed:@"Main0.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
        }
  

Это похоже на C / C / Java — if применяется к следующему оператору. Если вам нужно больше одного, вам нужно заключить операторы в фигурные скобки. Вы также могли бы постоянно вставлять завитушки, чтобы не беспокоиться об этом.

Кроме того, этот код

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.recipeData count];
    return [self.dessertsData count];
    return [self.beveragesData count];
}
  

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

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

1. Спасибо за ответ. Когда я ввожу фигурные скобки, как вы предлагаете, и выполняю это, результат остается тем же. Все строки по-прежнему заполнены объектами beveragesData.

2. вы сделали это для всех мест, которые вам нужны (а не только для того, которое я указал)

3. Да, я перенес это повсюду. Однако я сделал шаг назад, подумал, и сразу же выяснилось, где я ошибся. в конце я поместил return cell;} вместо фигурной скобки } return cell; таким образом, для ячейки устанавливалось значение, равное последней cell.textLabel settext. Теперь все отсортировано, и я благодарю вас за помощь 🙂

Ответ №2:

Ваш numberOfRowsInSection: раздел также неверен; должен быть:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if ( section == 0 )        
        return [self.recipeData count];
    if ( section == 1 )
        return [self.dessertsData count];
    if ( section == 3 )
        return [self.beveragesData count];
}
  

Ответ №3:

Вам также следует использовать switch инструкцию:

 switch ( indexPath.section ) 
{
    case 0:
    {
        if(indexPath.row == 0) {
            [cell.imageView setImage:[UIImage imageNamed:@"Main0.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
        }
        if(indexPath.row == 1) {
            [cell.imageView setImage:[UIImage imageNamed:@"Main1.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
        }
        if(indexPath.row == 2) {
            [cell.imageView setImage:[UIImage imageNamed:@"Main2.png"]];
            [cell.textLabel setText:[recipeData objectAtIndex:indexPath.row]];
        }
    }
}

/* etc. */
  

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

1. Привет, спасибо за ответы. Я изменил свой numberOfRowsInSection, чтобы отразить ваш совет. Однако, похоже, что оператор switch не имеет значения. Не уверен, что я реализую это неправильно, но когда я выполняю его — case0: case 1: etc, Когда я компилирую и пытаюсь вызвать это представление с помощью UITableView в приложении, завершается.