【发布时间】:2013-03-25 12:31:41
【问题描述】:
我有一个 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 行会重新加载而没有动画。
我可以通过调用 [self.tableview reloadData] 来解决这个问题,但我不想那样做,因为时间和 hackiness。有人知道如何防止这种行为吗?
【问题讨论】:
-
最奇怪的部分(但也许是一个线索)是这个问题在 iPhone 上似乎不存在。仅在 iPad 上。
-
更新:我设法通过在 observeValueForKeyPath: 方法的开头调用 [UIView setAnimationsEnabled:NO] 来强制它不动画,然后在最后将其设置回 YES。我仍然不确定为什么这只发生在这个 tableView 上(还有其他类似的对象),但我现在愿意跳过它,希望这篇文章能帮助其他人解决问题。
标签: uitableview key-value-observing