2011-01-30 3 views
9

У приложения в вопросе есть возможность для пользователей отмечать предметы как избранные. Когда пользователь не сохраняет избранное, я хотел бы уведомить их об этом (в основном я ненавижу идею пустой таблицыView).Показывать пользовательскую метку, если нет данных для таблицыView

Мой numberOfRowsInSection равен нулю, когда нет товаров, отмеченных как избранные пользователем. Я хотел бы установить cell.textLabel.text = @ «У вас нет избранных», но когда нет элементов для таблицы, cellForRowAtIndexPath не вызывается.

Я могу проверить numberOfRowsInSection, чтобы дать результат, когда он встречает 0, а затем тестирует 1 строку в cellForRowAtIndexPath, а затем вставляет пользовательский текст, но тогда что, если у них только один фаворит?

UPDATE

Я попытался реализации идеи я имел выше, и рекомендовал ниже, но, возможно, я не делаю это правильно, вероятно, связано с тем, что это fetchedResultsController с методами делегата для обновления таблицы, когда происходит изменение.

Я получаю эту ошибку, когда я удалить ячейку, когда есть только одна ячейка в таблице:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1447.6.4/UITableView.m:976 Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (1) must be equal to the number of rows contained in that section before the update (1), plus or minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted). with userInfo (null)

и когда нет никаких клеток, которые будут отображаться в первую очередь он падает с:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFBatchFaultingArray objectAtIndex:]: index (0) beyond bounds (0)'

Вот соответствующий код:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    // Return the number of rows in the section. 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section]; 

    if ([sectionInfo numberOfObjects]==0) { 
     return 1; 
    } else { 
     return [sectionInfo numberOfObjects]; 
    } 
} 

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

if ([[_fetchedResultsController sections] objectAtIndex:0]==0) { 
    cell.textLabel.text = @"You have no favorites"; 
} else { 
    Shows *show = [_fetchedResultsController objectAtIndexPath:indexPath]; 

    cell.textLabel.text = show.ShowsToSerials.serialName; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", show.showTitle]; 
} 
} 

ответ

30

1) В моих собственных приложениях iOS я создаю subview с UILabel в нем, говоря «Нет результатов» Когда numberOfSectionsInTableView равен нулю, я добавляю subview в tableview. Когда он равен нулю, я удаляю его. Это, конечно, требует сохранения подвью в памяти как сохраненного объекта, чтобы вы могли его удалить.

2) Если вы хотите сделать одну ячейку, как вы уже упоминали: Когда numberOfSectionsInTableView равен нулю, верните 1. Затем в numberOfRowsInSection верните 1 также. В cellForRowAtIndexPath проверьте как numberOfSectionsInTableView, так и numberOfRowsInSection, и если они ДОЛЖНЫ быть нулевыми (после всего, что вы вернули 1), тогда отобразите любое сообщение.

Решение 1 требует сохранения переменной для хранения подсмотра, но это более короткий и более чистый код, и я считаю, что это не так интенсивно (не из-за каких-либо существенных проблем с производительностью).

Редактировать включить код: На самом деле это было немного иначе, чем я думал, но в основном то же самое. Здесь, очевидно, есть вещи, которые нужно изменить, чтобы они соответствовали вашему коду и вкусу.

(Убедитесь, что объявить UIView * nomatchesView; в .h)

- (void)viewDidLoad{ 

     nomatchesView = [[UIView alloc] initWithFrame:self.view.frame]; 
     nomatchesView.backgroundColor = [UIColor clearColor]; 

     UILabel *matchesLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,320,320)]; 
     matchesLabel.font = [UIFont boldSystemFontOfSize:18]; 
     matchesLabel.minimumFontSize = 12.0f; 
     matchesLabel.numberOfLines = 1; 
     matchesLabel.lineBreakMode = UILineBreakModeWordWrap; 
     matchesLabel.shadowColor = [UIColor lightTextColor]; 
     matchesLabel.textColor = [UIColor darkGrayColor]; 
     matchesLabel.shadowOffset = CGSizeMake(0, 1); 
     matchesLabel.backgroundColor = [UIColor clearColor]; 
     matchesLabel.textAlignment = UITextAlignmentCenter; 

     //Here is the text for when there are no results 
     matchesLabel.text = @"No Matches"; 


     nomatchesView.hidden = YES; 
     [nomatchesView addSubview:matchesLabel]; 
     [self.tableView insertSubview:nomatchesView belowSubview:self.tableView]; 
    } 



    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
    { 
     //If there is no table data, unhide the "No matches" view 
     if([data count] == 0){ 
     nomatchesView.hidden = NO; 
     } else { 
     nomatchesView.hidden = YES; 
     } 

     return [data count]; 
    } 
+1

Не могли бы вы выслать код для своего решения 1? –

+0

Даниил. Еще раз спасибо за ваш код. Просто вопрос об управлении памятью. Я освобождаю представление в dealloc (это лучше?), Но где я должен снять ярлык? –

+0

У меня есть вид и все выпущено в dealloc. Я не верю, что для меня все течет. –

9

Что я лично сделаю, так это следующее. Как вы сказали сами, в методе numberOfRowsInSection вы должны проверить счетчик вашего источника данных tableView, если его 0 вы должны вернуть 1, чтобы отобразить 1 ячейку.

Затем в cellForRowAtIndexPath вы должны снова проверить счетчик, если он возвращает 0, вы знаете, что представление таблицы пытается нарисовать ваш «у вас нет избранных», и вы можете установить текст.

+1

Это также отличное предложение. –

5

Как упомянуто ниже ссылку легко, если мы создаем ярлык и установить, что в качестве фонового представления для UITableView как ниже. http://www.appcoda.com/pull-to-refresh-uitableview-empty/

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    if (data) { 

     self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
     return 1; 

    } else { 

     // Display a message when the table is empty 
     UILabel *messageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)]; 

     messageLabel.text = @"No data is currently available. Please pull down to refresh."; 
     messageLabel.textColor = [UIColor blackColor]; 
     messageLabel.numberOfLines = 0; 
     messageLabel.textAlignment = NSTextAlignmentCenter; 
     messageLabel.font = [UIFont fontWithName:@"Palatino-Italic" size:20]; 
     [messageLabel sizeToFit]; 

     self.tableView.backgroundView = messageLabel; 
     self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; 

    } 

    return 0; 
} 
+0

Спасибо. Все нормально. – Raja

Смежные вопросы