2012-01-31 4 views
2

У меня есть UITableView, где источником данных являются данные ядра с использованием NSFetchRequest. Основные данные содержат новости, загруженные из базы данных на моем веб-сайте. Основные данные по умолчанию содержат 50 новейших элементов, а более старые элементы загружаются с леними, когда достигается нижняя часть UITableView.Как добавить пользовательскую ячейку в нижней части UITableView?

В настоящее время я занимаюсь этим с использованием метода tableView:numberOfRowsInSection, где я возвращаю +1 для последнего раздела, который является моей ячейкой «Загрузка элементов». В методе tableView:cellForRowAtIndexPath я создаю ячейку «Загрузка элементов», когда IndexPath является последней строкой в ​​последнем разделе.

Проблема заключается в том, что когда новые данные загружаются, ячейка, которая ранее была ячейкой «Загрузка элементов», теперь является обычной ячейкой элемента новостей. Но затем ячейка сначала перезагружается, когда я прокручиваюсь от камеры и возвращается.

Я мог бы хранить indexPath для ячейки «loading items» и перезагрузить эту ячейку, когда ленивая загрузка закончена. Но я хотел бы знать, существуют ли какие-либо лучшие решения этой проблемы?

EDIT1:

Вот моя процедура для создания "пунктов погрузки" UITableViewCell.

cell.textLabel.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)]; 

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

UIImage *spacer = [UIImage imageNamed:@"Spacer"]; 

UIGraphicsBeginImageContext(spinner.frame.size); 
[spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)]; 
UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

cell.imageView.image = resizedSpacer; 
[cell.imageView addSubview:spinner]; 
[spinner startAnimating]; 

EDIT2:

Я пытаюсь "дизайн" footerView, используя приведенный ниже код. В настоящее время индикатор активности находится в верхнем левом положении, и метка не видна.

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { 
    NSInteger sectionsAmount = [tableView numberOfSections]; 
    if (section == sectionsAmount - 1) { 
     return 20; 
    } 
    return 0; 
} 

- (UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { 
    NSInteger sectionsAmount = [tableView numberOfSections]; 
    if (section == sectionsAmount - 1) { 
     if (_tableFooterView==nil) { 
      UIView *view = [[UIView alloc] init]; 

      UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

      UIImage *spacer = [UIImage imageNamed:@"Spacer"]; 

      UIGraphicsBeginImageContext(spinner.frame.size); 
      [spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)]; 
      UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext(); 
      UIGraphicsEndImageContext(); 

      UIImageView *imageView = [[UIImageView alloc] init]; 

      imageView.image = resizedSpacer; 
      [imageView addSubview:spinner]; 
      [spinner startAnimating]; 

      [view addSubview:imageView]; 

      UILabel *label = [[UILabel alloc] init]; 
      label.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)]; 
      [view addSubview:label]; 

      _tableFooterView = view; 
     } 
     return self.tableFooterView; 
    } 
    return nil; 
} 

Как я могу изменить UIView, чтобы выглядеть, как на рисунке ниже: Loading more..

EDIT3:

Вот мой setupTableFooterView где я назначая вид на tableFooterView. Метод вызывается из окна viewDidLoad.

- (void) setupTableFooterView { 
    UIView *view = [[UIView alloc] init]; 

    UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

    UIImage *spacer = [UIImage imageNamed:@"Spacer"]; 

    UIGraphicsBeginImageContext(spinner.frame.size); 
    [spacer drawInRect:CGRectMake(0,0,spinner.frame.size.width,spinner.frame.size.height)]; 
    UIImage* resizedSpacer = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    UIImageView *imageView = [[UIImageView alloc] init]; 

    imageView.image = resizedSpacer; 
    [imageView addSubview:spinner]; 
    [spinner startAnimating]; 

    imageView.frame = CGRectMake(10, 11, 20, 20); 
    [view addSubview:imageView]; 

    UILabel *label = [[UILabel alloc] init]; 
    label.text = [NSString stringWithFormat:@"%@\u2026", NSLocalizedString(@"LOADING_MORE", nil)]; 
    [label setFont:[UIFont italicSystemFontOfSize:13]]; 
    [label setFrame:CGRectMake(40, 0, 270, 43)]; 
    [view addSubview:label]; 

    self.tableView.tableFooterView = view; 
} 

ответ

5

Используйте для этого сообщения UITableViewtableFooterView. Таким образом, вам не нужно заниматься секцией/строками.

От UITableView reference:

tableFooterView 

Возвращает вид аксессуар, который отображается под таблицей.

@property(nonatomic, retain) UIView *tableFooterView 

Обсуждение

Значение по умолчанию равно нулю. Вид нижнего колонтитула стола отличается от нижнего колонтитула .

+0

Спасибо за ваш комментарий, я думаю, это может быть решением для меня. Я безуспешно пытаюсь настроить tableFooterView. Не могли бы вы взглянуть на мой «EDIT2»? – dhrm

+0

Вы внедряете sectionFooter, я предлагаю использовать tableFooter. Конечно, sectionFooter - это вариант, но я бы рекомендовал вместо этого использовать tableFooter. Проверьте ссылку, пожалуйста. – Till

+0

Извините, вы, где правильно. Я добавил инициализацию вида в * viewDidLoad *. Не могли бы вы увидеть мой «EDIT3»? – dhrm

0

Вы не используете [tableView reloadData] в своем ленивом обратном вызове загрузки? Поэтому, когда сервер отправляет больше результатов, и они добавляются к вашему источнику данных, логика рисования таблицы восстанавливается, а дополнения к numberOfRowsInSection правильно учитываются?

Кроме того, я думаю, что ваше предложение только назначить последнюю ячейку таблицы в качестве «Загрузка ячейки», вероятно, будет работать нормально. Синтезируйте сохраненное свойство или переменную-член и сохраните в нем ссылку на загрузку, и просто проверьте indexPath до того, как будет вызвана вся логика создания ячейки. Если это последняя ячейка в таблице, просто верните self.loadingCell.

0

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

Когда доступны новые данные, сообщите о представлении таблицы в новых строках с помощью insertRowsAtIndexPaths:withRowAnimation:.

+0

Хорошее предложение, поддержанное – Justin

+0

Извините, но у меня есть несколько разделов. – dhrm