0

Я уверен, что есть более простой способ сделать это, который мне не хватает во всем моем чтении ... но это сводит меня с ума. Я очень устал - и извиняюсь, если это становится многословным.NSFetchedResultsChangeMove, отображающий неправильную метку в пользовательском UITableViewCell

Я использую NSFetchedResultsController в своем приложении - очень стандартная проблема - и он работает. Два раздела, упорядоченные должным образом и т. Д. Когда пользователь отбирает ячейку в первом разделе (значение BOOL свойства, создающего два раздела, отменяется) - он перемещается во второй раздел (значение BOOL снова перевернуто) - и наоборот. .., работает классно.

Вот где моя реализация становится немного фанки. В конце концов я хочу поддерживать iAds - в соответствии с HIG они должны быть помещены в нижней части экрана ... Самый простой способ, который я нашел, - это установить UITableView внутри UIView, чтобы избежать некоторых логических причин, которые ускользают от меня сейчас - но это то, что у меня есть - UIView с UITableView.

Я использую раскадровки с ячейками прототипов - два для конкретных. Один используется для добавления контента и действует как разделитель между двумя разделами. Другая - ячейка по умолчанию для отображения. Когда я регистрирую IBOutlets для этой ячейки - это генерирует исключение (это проблема, но я могу обойти ее). Таким образом, вместо того, что я делал это с помощью cell.contentView.subviews, чтобы добраться до элементов мне нужно возиться с:

NSArray *cellSubViews = cell.contentView.subviews; 
if ([cellSubViews count] == 3) { 
    // editing accessory view 
    cell.editingAccessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    // default background image view 
    cell.backgroundView = self.defaultClockCellBackgroundImageView; 

    // clock name label 
    UILabel *clockNameLabel = [cellSubViews objectAtIndex:2]; 
    clockNameLabel.text = clock.name; 
    clockNameLabel.textColor = (indexPath.section == 0 && ![clock.isAddClockCell boolValue]) 
    ? [UIColor whiteColor] 
    : [UIColor lightTextColor]; 

    // view child button 
    UIButton *viewChildButton = [cellSubViews objectAtIndex:0]; 
    UIImage *viewChildClocksButtonBackgroundImage; 
    if (self.clockForFetch != nil) { 
     //NSLog(@"child clocks list - N/A"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"childcell_blank"]; 
     viewChildButton.enabled = NO; 

    } else if ([clock.childClocks count] < 2) { 
     //NSLog(@"add child button"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_addchild"]; 

    } else if (![clock.isRunning boolValue] 
       || [self totalChildClocksRunning:clock] < 1) { 
     //NSLog(@"view child button"); 
     // children clocks cannot be running while parent is stopped; 
     // therefore, no need to actually check 
     // this solves the "wait for cell animation to end" issue 
     // without the need for tableview reload data 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild"]; 

    } else { 
     //NSLog(@"view child running button"); 
     viewChildClocksButtonBackgroundImage = [UIImage imageNamed:@"parentcell_viewchild_running"]; 

    } 
    [viewChildButton setImage:viewChildClocksButtonBackgroundImage forState:UIControlStateNormal]; 
    viewChildButton.hidden = NO; 

    // view time entries list for clock 
    UIButton *detailDisclosureButton = [cellSubViews objectAtIndex:1]; 
    UIImage *detailDisclosureButtonBackgroundImage = (self.clockForFetch == nil) 
    ? [UIImage imageNamed:@"parentcell_detaildisclosure"] 
    : [UIImage imageNamed:@"childcell_detaildisclosure"]; 
    [detailDisclosureButton setImage:detailDisclosureButtonBackgroundImage 
          forState:UIControlStateNormal]; 
    detailDisclosureButton.hidden = NO; 

    if (self.editing) { 
     viewChildButton.hidden = YES; 
     detailDisclosureButton.hidden = YES; 
    } 
} 

Пожалуйста, обратите внимание: до этого метода я использовал отдельный СИБ с IBOutlets и может повторить проблему - просто не так последовательно.

Вот таблица с тремя ячейками, которые движутся при нажатии (Alpha, Beta и Gamma) ... ах, никаких изображений к новым извините - хотелось бы, чтобы они сказали мне, что до того, как я загрузил изображения, войдите в ASCII art :

--------------- 
| alpha | 
--------------- 
| beta  | 
--------------- 
| gamma | 
--------------- 
| *delimiter* | 
--------------- 

Вот таблица после нажатия альфа- и бета-клетки:

--------------- 
| gamma | 
--------------- 
| *delimiter* | 
--------------- 
| beta  | 
--------------- 
| beta  | 
--------------- 

Однако, если нажать на кнопку заказ подробно о раскрытии в первой ячейке с надписью «Beta» (который следует читать Alpha), я получаю правильный объект, переданный в подробный вид:

-------------------------------------------- 
| < back detail view for alpha  edit | 
-------------------------------------------- 

Итак, обновленный контроллер результатов обновляется - он, похоже, не всегда настраивает параметры, когда разговаривает с табличным представлением. В вышеописанном методе ячейки конфигурации я проверил, чтобы увидеть имена объектов, найденных в контроллере, - и они также верны; то есть первая бета-ячейка (ячейка для строки на пути индекса 1,0) представляет собой Alpha - not Beta - хотя в представлении таблицы отображается Бета.

Я все время вижу упоминание пользовательских ячеек, требующих setNeedsDisplay и/или setNeedsLayout, но я не думаю, что я вполне понимаю, что один, хотя я попытался поместить его почти везде, о котором я мог думать в коде. «NSFetchedResultsChangeMove» - это то, что вызывается, когда пользователь забирает ячейку - и я пробовал множество вариаций, которые я видел в Интернете (в том числе здесь), чтобы исправить глюки, которые, как я думал, были похожи - безрезультатно.

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

Любая помощь будет принята с благодарностью. И, если есть ответ на этот точный вопрос, я извиняюсь за повторение.

+0

Пс. В классе Standford из iTunes U есть элемент, называемый Контроллером таблиц с контролем получаемых результатов ... есть некоторые методы, касающиеся приостановки автоматических обновлений из контекста управляемого объекта. Мне интересно, может ли это быть связано с проблемой; однако, не знаю, как проверить ... все еще не знакомы с наследованием объектов в Objective-C. –

ответ

0

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

  1. У меня есть две разные ячейки прототипа: по умолчанию одна и разделительная. Таким образом, вызов ячейки конфигурации на пути индекса напрямую может привести к неожиданным результатам. Поэтому, где бы я ни называл configureCell atIndexPath, я просто называл cellForRowAtIndexPath. Например, в моих принесенных методах таблицы обновления контроллера результатов, я изменил все, чтобы назвать cellForRowAtIndexPath вместо (в частности обновления изменения случая - который обычно вызов настройки ячейки для строки с индексом путем:

    case NSFetchedResultsChangeUpdate: 
        //NSLog(@"NSFetchedResultsChangeUpdate"); 
        [self.TJTableView cellForRowAtIndexPath:indexPath]; 
        break; 
    
  2. Идущими через ячейку просмотр содержимого с использованием subviews, похоже, не поддерживает себя, и это не очень элегантный способ сделать что-то, поэтому я подклассифицировал UITableViewCell с пользовательской ячейкой в ​​учебной статье здесь - http://bit.ly/oI2GGW - таким образом я мог подключить IBOutlets и ссылку на метку и кнопки непосредственно в строке конфигурации по пути индекса.

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