UITableView Нет экрана данных - PullRequest
8 голосов
/ 20 июля 2010

Мой UITableView получает данные из интернета.Иногда он не получает никаких (сотовых) данных.Он просто показывает пустую таблицу.

Как показать пользователю сообщение / ячейку о том, что записи данных не найдены?

Ответы [ 6 ]

25 голосов
/ 20 июля 2010

Вы хотите вернуть одну ячейку, сообщающую об отсутствии данных.

Если вы храните данные своей ячейки в массиве, который является свойством класса (скажем, NSArray *listings), вы можете перейти:

-(NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section
{
    if ([self.listings count] == 0) {
         return 1; // a single cell to report no data
    }
    return [self.listings count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([self.listings count] == 0) {
        UITableViewCell *cell = [[[UITableViewCell alloc] init] autorelease];
        cell.textLabel.text = @"No records to display";
        //whatever else to configure your one cell you're going to return
        return cell;
    }

    // go on about your business, you have listings to display
}
2 голосов
/ 30 марта 2011

Вы можете добавить UILabel к вашему виду. Это может быть создано программно или в вашей xib.Если ваша xib содержит UITableView как [self view], как это типично для UITableViewController, то создайте свойство для метки на вашем viewController

@property (nonatomic, retain) IBOutlet UILabel       *noResultsLabel;

Перетащите UILabel из библиотеки в окно документа какбрат к вашему «представлению таблицы».Установите свойства текста (жирный шрифт 36pt, светло-серый выглядит довольно хорошо)
Управляйте перетаскиванием из «Владельца файла», чтобы подключить розетку к этикетке.

UITableView with no results UILabel

На вашем сервереобратный вызов, вы можете добавить метку к представлению.Вот пример:

#pragma mark -
#pragma mark Server callbacks
- (void)serviceExecutionComplete:(NSMutableArray *)results {
    [self setServerData:results];
    if ([results count] == 0)
    {
        // no results,
        CGRect viewFrame = [[self view] frame];
        [[self noResultsLabel] setFrame:CGRectMake(0, (viewFrame.size.height - 100) / 2, viewFrame.size.width, 50.0)];
        [[self view] addSubview:[self noResultsLabel]];
    }
    else
    {
            [[self noResultsLabel] removeFromSuperview];
        [self.tableView reloadData];
    }
}

Вы можете сделать то же самое в tableView: numberOfRowsInSection: если это лучше подходит вашему дизайну

2 голосов
/ 20 июля 2010

Вы можете добавить тест в вашу -tableView: cellForRowAtIndexPath: реализацию и отобразить специальный UITableViewCell, говорящий «нет результатов», когда вы не получаете данных.

Другой подход, который обычно выглядит лучше, - это непосредственное добавление пользовательского представления в UITableView. Не забудьте удалить его, когда появятся результаты.

1 голос
/ 03 марта 2015

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

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    if (data) {
        self.tableView.backgroundView = nil;
        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;
}
1 голос
/ 05 апреля 2014

Я собирался показать emptyDataView в верхнем или нижнем колонтитуле или взломать один из рядов, как предложенный ответ от Дана.

Но я думаю, что самое чистое - создать представление вне tableView.

@property (weak, nonatomic) IBOutlet UIView *emptyDataView;

Затем скрыть / показать представление в numberOfRowsInSection:, например:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section];

    // Show empty data view if no data
    _emptyDataView.hidden = ([sectionInfo numberOfObjects] == 0) ? NO : YES;

    return [sectionInfo numberOfObjects];
}

Это хорошо работает с Core Data NSFetchedResultsController и скрывает представление при наличии данных.

0 голосов
/ 29 июня 2016

Здесь я использую код вроде:

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
NSInteger numOfSections = 0;
if ([jsonArray count] != 0){
    tableview.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    numOfSections                 = 1;
    tableview.backgroundView   = nil;
}
else{
    UILabel *noDataLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, tableview.bounds.size.width, tableview.bounds.size.height)];
    noDataLabel.text             = @"No item found.";
    noDataLabel.textColor        = [UIColor blackColor];
    noDataLabel.textAlignment    = NSTextAlignmentCenter;
    tableview.backgroundView     = noDataLabel;
    tableview.separatorStyle     = UITableViewCellSeparatorStyleNone;
}
  return numOfSections;
}

- (NSInteger)tableView:(UITableView *)theTableView numberOfRowsInSection:(NSInteger)section{
    return [jsonArray count ];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...