Почему мой UILabel в UIView в UITableCellView не обновляется после правильного вызова базы данных (кажется, связанное с повторным использованием ячейки)? - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть ячейка UITableview, которая получает данные из основной базы данных. TallyTable находится в контроллере представления внутри представления UITab. У меня есть заявление NSLog, которое выводит значение подсчета всякий раз, когда оно обновляется. Другая вкладка имеет список для изменения источника (другой день) для подсчета голосов. Я использую iOS5 с ARC для iOS 4.2.

Вот проблема. Когда я загружаю приложение, на вкладке таблицы отображаются правильные подсчеты за последний выбранный день. Если я затем перейду на вкладку «День», изменим день и вернусь к вкладке «Подсчет», на дисплее не будет никаких изменений. Однако viewWillAppear на вкладке подсчета запускается, и, когда таблица циклически перебирает cellForIndexPath, мой оператор NSLog выводит все правильные новые значения. Если я затем прокручиваю верхнюю метку за пределы экрана и возвращаю метку, она обновляется до нового значения.

Я пробовал setNeedsLayout и setNeedsDisplay на UILabel, UITableViewCell, UITableView и контроллере представления, загружающем таблицу. Я попытался изменить идентификатор CellReuse, чтобы он никогда не использовал ячейку повторно.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";    
    CollectionItemTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CollectionItemTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [[self.collectionKeys objectAtIndex:row] valueForKey:@"collectionTitle"];
    NSInteger test1 = indexPath.row + 150;
    NSLog(@"tag = %i", test1);
    cell.tallyButton.tag = test1;
    NSNumber * questionID = [[self.collectionKeys objectAtIndex:row] valueForKey:@"answerID"];
    cell.tallyLabel.text = [NSString stringWithFormat:@"%i",[self updatePointTotal:questionID]];
NSLog(@"Collection text should be = %@", [NSString stringWithFormat:@"%i",[self updatePointTotal:questionID]]);

    [cell setNeedsLayout];

    return cell;
}

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

РЕДАКТИРОВАТЬ: Я думал, что я исправил это с помощью контроллера навигации, чтобы снова установить контроллер представления верхнего уровня на представление. Я признаю, что теперь это похоже на классически клёвый хак во всех отношениях. Когда вид нажимается, все обновляется, и это без шва. Однако, чтобы иметь фиксированный нижний колонтитул для настройки параметров выбора кнопок таблицы, я использовал UIView с двумя подпредставлениями, UITableView сверху и простой UIView с четырьмя кнопками внизу.

Надписи на кнопках необходимо менять в зависимости от источника данных. Теперь, когда контроллер представления помещен в представление, он скрывает мой фиксированный вид нижнего колонтитула. Итак, я вставил фиксированный нижний колонтитул в UITableview, и все выглядело нормально, пока я не прокрутил UITableView и не прокрутил его вместе с ним. Таблица в основном представляет собой подсчетный лист с кнопками рядом с каждым элементом, а в нижнем колонтитуле - четыре кнопки, чтобы отметить цвет подсчитанного элемента. Скажем, следующий элемент был зеленым lego, вы должны нажать «зеленый» в нижнем колонтитуле и кнопку рядом с «lego» в таблице. Когда я нажимаю контроллер представления с двумя подпредставлениями, метки UITableview не обновляются. Таким образом табличное представление должно быть выдвинуто само (насколько я могу сказать).

ОТВЕТ: см. Комментарий ниже, но в конечном итоге мне нужно было перезагрузить как видимые данные UITableView, так и данные контроллера UITableView делегата за ним.

Ответы [ 2 ]

1 голос
/ 04 ноября 2011

Я попробую.Во-первых, вы используете ARC?Если нет, вам нужно добавить autorelease при выделении / инициализации новой ячейки.В противном случае все в порядке.

Если я правильно понимаю ваш вопрос:

  • В TableView отображаются правильные данные при запуске приложения

  • Вы переключаетесь с вкладки с помощью tableView и меняете tableView dataSource

  • Вы переключаетесь на вкладку с tableView и видите (через NSLog), что таблицаячейки загружаются с правильными данными, но старые данные все еще видны в ячейках

  • Если вы прокрутите ячейку с дисплея и вернетесь назад, чтобы обновить ее, она содержит правильные данные

Некоторые мысли:

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

  2. Вам не нужно звонить setNeedsLayout на ячейку, если только вы не хотите, чтобы ячейка ретранслировала свои подпредставления на основе данных.Вам также не нужно setNeedsDisplay.

  3. Я предполагаю, что нет других усложняющих факторов (таких как несколько табличных представлений, отображающих одни и те же данные), которые могли бы запутать вещи.

0 голосов
/ 10 октября 2016

Если вы используете метод подготовки к повторному использованию, не забудьте переопределить исходный метод с помощью [super prepareForReuse];

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

Я использую тот же метод, который применял к некоторым представлениям моей коллекции: мы должны удалить / сбросить ваше подпредставление, когда вы создаете / добавляете его к содержимому ячейки.Это означает, что нам нужно полностью настроить данные для каждой ячейки для каждой строки.

Я переместил значение данных для сброса кода из подготовительного повторного использования в место, где я установил значение, и я работал просто!

В моем CustomCell.m:

- (void)configCellWith:(id)item At:(NSUInteger)row { 
  if (_scrollView) {
            [[_scrollView subviews]
             makeObjectsPerformSelector:@selector(removeFromSuperview)];
            _scrollView = nil;
            [_scrollView removeFromSuperview];
        }

        else {

            CGFloat y = labelHeight+15;
            float scrollHeight = _imgArray.count*200;
            _scrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(10,  y,SCREEN_WIDTH-20, scrollHeight)];
            _scrollView.scrollEnabled=YES;
            _scrollView.userInteractionEnabled=YES;
            _scrollView.layer.masksToBounds = YES;
            [self.contentView addSubview:_scrollView]; } }

Не забудьте также соответствующим образом изменить источник данных.

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