#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 в приложении, завершается.