当上一部分被隐藏时,UITableView重新加载包含不需要的淡入淡出的行

时间:2013-03-25 12:31:41

标签: uitableview key-value-observing

我有一个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];   
    }
}

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

问题:当我隐藏了属性上面的部分,并且我更改了positionX的值时,第0行的单元格(正确的positionX单元格)不是使用UITableViewRowAnimationNone重新加载,而是使用什么似乎是UITableViewRowAnimationFade。它移动了,我不想要它。我的子类直接来自UITableViewController,并且类中没有其他方法可以使用除-RowAnimationNone之外的任何内容重新加载任何行或节。当我尝试重新加载没有动画的整个部分时,整个部分动画。该部分中的其他行都不像这样;他们正确地重新加载,没有动画。当行0上面的部分未被隐藏时,行0重新加载而没有动画。

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

1 个答案:

答案 0 :(得分:0)

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