2013-03-25 2 views
0

У меня есть UITableViewController, который отображает свойства NSManagedObject в сгруппированном tableView. Значения этих свойств могут быть изменены из пользовательских подклассов UITableViewCell с UISteppers и UITextFields. В таблице обычно есть 9 разделов, но когда некоторые из свойств NSManagedObject равны нулю, я скрыть эти разделы, установив для параметра numberOfRowsInSection значение 0, а также heightForHeaderInSection и heightForFooterInSection на 1. Это работает нормально; разделы скрыты.UITableView перезагружает строку с нежелательным исчезновением, когда предыдущий раздел скрыт

Пользовательские ячейки вызывают метод делегата, который изменяет значения свойств NSManagedObject, а UITableViewController настроен на KVO, отслеживает свойства объекта NSManagedObject и перезагружает отдельные строки при изменении соответствующих свойств. Вот начало метода:

#define POSITION 3 
#define TARGETED_BY 5 

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if ([keyPath isEqualToString:@"positionX"]) { 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:POSITION]] 
           withRowAnimation:UITableViewRowAnimationNone]; 

    } else if ([keyPath isEqualToString:@"positionY"]) { 
     [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:1 inSection:POSITION]] 
           withRowAnimation:UITableViewRowAnimationNone]; 

    } else if ([keyPath isEqualToString:@"isTargetedBy"]) { 
     [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:TARGETED_BY] 
         withRowAnimation:UITableViewRowAnimationNone]; 
    } 
} 

Это не полный метод со всеми свойствами, но вы получаете идею.

ПРОБЛЕМА: когда я спрятал раздел выше свойств, и изменить значение, то Позиция X ячейку в строке 0 (правильные клетки Позиции X) перезагружает не с UITableViewRowAnimationNone, но с тем, что, как представляется, UITableViewRowAnimationFade , Он движется, и я не хочу этого. Мой подкласс находится непосредственно из UITableViewController, и в этом классе нет другого метода, который перезагружает любые строки или разделы каким-либо другим, кроме -RowAnimationNone. И когда я пытаюсь перезагрузить весь раздел без анимации, весь раздел анимации. Ни одна из других строк в разделе не ведет себя так: они перезагружаются правильно, без анимации. И строка 0 перезагружается без анимации, когда раздел над ней не скрыт.

Я могу обойти это, позвонив [self.tableview reloadData], но я бы предпочел не делать этого таким образом, ради времени и взлома. Кто-нибудь знает, как предотвратить это поведение?

+0

Нечетная часть (но, возможно, подсказка) заключается в том, что эта проблема не существует на iPhone. Только на iPad. –

+0

Обновление: мне удалось заставить его не анимировать, вызвав [UIView setAnimationsEnabled: NO] в начале метода observValueForKeyPath: затем вернув его в YES в конце. Я до сих пор не знаю, почему это происходит только на этом столе. Есть только похожие объекты, но я готов перейти к нему пока, и, надеюсь, это сообщение поможет кому-то еще с обходным решением. –

ответ

0

Это может усложниться, когда задействовано много секций. Я думаю, вы пытаетесь воспроизвести то, что уже делает свободная среда Sensible TableView. Структура автоматически генерирует все ваши разделы на основе данных вашего управляемого объекта и может определять, какие разделы делать видимыми, основываясь на ваших собственных правилах. Стоит проверить, так как это может сэкономить массу времени, пытаясь изобрести все это.

+0

Спасибо Мэтт. Что расстраивает, так это то, что причиной этого является только очень конкретный случай. В остальное время он работает точно так, как я хочу. Я не могу найти вызов для анимации чего-либо в любом месте класса. На данный момент, я не думаю, что начать с фреймворка сэкономит мне время, хотя, поскольку я уже работал на 99% отлично с моим собственным подклассом. –

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