0

我有一个 UITableViewController,它在分组的 tableView 中显示 NSManagedObject 的属性。可以从具有 UISteppers 和 UITextFields 的自定义 UITableViewCell 子类更改这些属性的值。该表通常有 9 个部分,但是当 NSManagedObject 的某些属性为 nil 时,我通过将 numberOfRowsInSection 设置为 0 以及将 heightForHeaderInSection 和 heightForFooterInSection 设置为 1 来隐藏这些部分。这些部分是隐藏的。

自定义单元格调用更改 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];   
    }
}

这不是具有所有属性的完整方法,但您明白了。

问题:当我隐藏了 PROPERTIES 上方的部分并更改了 positionX 的值时,第 0 行的单元格(正确的 positionX 单元格)不会重新加载 UITableViewRowAnimationNone,而是使用 UITableViewRowAnimationFade 重新加载。它会动,我不希望它动。我的子类直接来自 UITableViewController,并且类中没有其他方法可以重新加载除 -RowAnimationNone 之外的任何行或节。当我尝试在没有动画的情况下重新加载整个部分时,整个部分都会动画。该部分中的其他行都没有这样的行为;他们重新加载正确,没有动画。当第 0 行上方的部分未隐藏时,第 0 行会重新加载且没有动画。

我可以通过调用 [self.tableview reloadData] 来解决这个问题,但为了时间和 hackiness,我不想那样做。任何人都知道如何防止这种行为?

4

1 回答 1

0

当涉及许多部分时,这可能会变得复杂。我认为您正在尝试复制免费的 Sensible TableView 框架已经做的事情。该框架将根据您的托管对象的数据自动生成您的所有部分,并且可以根据您自己的规则确定要使哪些部分可见。值得一试,因为它可以为您节省大量尝试重新发明这一切的时间。

于 2013-03-25T18:57:14.677 回答