0

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

4

1 に答える 1

0

多くのセクションが関係している場合、これは複雑になる可能性があります。無料のSensible TableViewフレームワークがすでに行っていることを複製しようとしていると思います。フレームワークは、管理対象オブジェクトのデータに基づいてすべてのセクションを自動的に生成し、独自のルールに基づいてどのセクションを表示するかを決定できます。これらすべてを再発明しようとする時間を大幅に節約できるので、チェックする価値があります。

于 2013-03-25T18:57:14.677 に答える