グループ化されたtableViewにNSManagedObjectのプロパティを表示するUITableViewControllerがあります。これらのプロパティの値は、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] を呼び出すことでこれを回避できますが、時間とハッキングの観点から、その方法は避けたいと思います。この動作を防ぐ方法を知っている人はいますか?