Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当上一节被隐藏时,UITableView将以不需要的淡入度重新加载行_Uitableview_Key Value Observing - Fatal编程技术网

当上一节被隐藏时,UITableView将以不需要的淡入度重新加载行

当上一节被隐藏时,UITableView将以不需要的淡入度重新加载行,uitableview,key-value-observing,Uitableview,Key Value Observing,我有一个UITableViewController,它在分组的tableView中显示NSManagedObject的属性。可以从具有UIStepper和UITextFields的自定义UITableViewCell子类更改这些属性的值。该表通常有9个部分,但当NSManagedObject的某些属性为零时,我会通过将numberOfRowsInSection设置为0,以及将heightForHeaderInSection和heightForFooterInSection设置为1来隐藏这些部分。

我有一个UITableViewController,它在分组的tableView中显示NSManagedObject的属性。可以从具有UIStepper和UITextFields的自定义UITableViewCell子类更改这些属性的值。该表通常有9个部分,但当NSManagedObject的某些属性为零时,我会通过将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行上方的部分未隐藏时,将重新加载该行,但不显示动画


我可以通过调用[self.tableview reloadData]来解决这个问题,但出于时间和黑客的考虑,我不希望这样做。有人知道如何防止这种行为吗?

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

最奇怪的部分(但可能是一个线索)是,iPhone上似乎不存在这个问题。仅在iPad上。更新:我在observeValueForKeyPath:方法的开头调用[UIView SetAnimationEnabled:NO],然后在结尾将其设置回YES,从而强制它不设置动画。我仍然不知道为什么这只发生在这个tableView上(还有其他类似的对象),但我现在愿意跳过它,希望这篇文章能帮助其他人解决问题。谢谢Matt。令人沮丧的是,导致这种行为的只是一个非常具体的案例。剩下的时间,它的工作原理和我想要的一模一样。我在班上任何地方都找不到任何动画调用。在这一点上,我不认为用一个框架重新开始会节省我的时间,因为我已经让它在我自己的子类中工作了99%。