Как добавить пользовательскую ячейку внизу UITableView? - PullRequest
2 голосов
/ 01 февраля 2012

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

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

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

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

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;
}

Ответы [ 3 ]

5 голосов
/ 01 февраля 2012

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

Из ссылки UITableView :

tableFooterView

Возвращает вспомогательное представление, отображаемое под таблицей.

@property(nonatomic, retain) UIView *tableFooterView

Обсуждение

Значением по умолчанию является ноль. Вид нижнего колонтитула таблицы отличается от нижний колонтитул.

0 голосов
/ 01 февраля 2012

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

Если доступны новые данные, сообщите табличному представлению о новых строках, используя insertRowsAtIndexPaths:withRowAnimation:.

0 голосов
/ 01 февраля 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...