Я уверен, что есть более простой способ сделать это, который мне не хватает во всем моем чтении ... но это сводит меня с ума. Я очень устал - и извиняюсь, если это становится многословным.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» - это то, что вызывается, когда пользователь забирает ячейку - и я пробовал множество вариаций, которые я видел в Интернете (в том числе здесь), чтобы исправить глюки, которые, как я думал, были похожи - безрезультатно.
Я уверен, что эта конструкция созреет со временем (так как это первый шаг), но, как я уже сказал, я столкнулся с той же проблемой с совершенно другой конструкцией (в то время не существовало раскадровки) - и все еще может повторить этот вопрос.
Любая помощь будет принята с благодарностью. И, если есть ответ на этот точный вопрос, я извиняюсь за повторение.
Пс. В классе Standford из iTunes U есть элемент, называемый Контроллером таблиц с контролем получаемых результатов ... есть некоторые методы, касающиеся приостановки автоматических обновлений из контекста управляемого объекта. Мне интересно, может ли это быть связано с проблемой; однако, не знаю, как проверить ... все еще не знакомы с наследованием объектов в Objective-C. –