7

UITableViewControllerのアプリには、ビュー階層に直接追加されたがあります。ビューが表示されたら、特定のセルにスクロールします。私の解決策は、でスクロールするためのコードを呼び出すことです-[viewDidAppear]

Appleのドキュメントによると、メソッドを手動で呼び出す必要があります。

ビューコントローラに属するビューがビュー階層に直接追加された場合、ビューコントローラはこのメッセージを受信しません。ビューをビュー階層に挿入または追加し、ビューコントローラがある場合は、関連するビューコントローラにこのメッセージを直接送信する必要があります。

問題は、手動で呼び出すのに適切なタイミングはいつかということです。

親ビューコントローラから呼び出すと-[viewDidAppear]、スクロールを実行しようとするとクラッシュが発生します。これは、テーブルビューが実際にまだ表示されていないため、スクロールするセクションがないと考えているためです。

4

4 に答える 4

19

ビューコントローラの封じ込めを使用している場合は、viewWillAppear:直接呼び出さないでください。代わりにとを使用– beginAppearanceTransition:animated:して– endAppearanceTransitionください。

カスタムコンテナコントローラーを実装している場合は、このメソッドを使用して、ビューが表示または非表示になりそうであることを子に通知します。viewWillAppear:、viewWillDisappear:、viewDidAppear:、またはviewDidDisappear:を直接呼び出さないでください。

addSubViewを呼び出すと自動的にトリガーさviewWillAppear:viewDidAppear:、ビューのviewControllerが子View Controllerである場合、viewWillAppear:直接呼び出すとviewwillappearanceメソッドが2回トリガーされます。beginAppearanceTransition:animated:and– endAppearanceTransition`を使用すると、自動動作が抑制されるため、呼び出されるのは1回だけです。

于 2014-07-30T09:22:48.217 に答える
1

親ビューコントローラの-[viewDidAppear]から実際に呼び出されるテーブルビューの-[viewDidAppear]で、[tableView reloadData]を呼び出すことができます。これにより、tableViewがロードされて準備ができていることを確認できます。

于 2009-09-22T17:59:05.203 に答える
0

通常、親コントローラーの-viewDidAppearから呼び出すのが最善の策です。

子ViewControllerがまだ完全に初期化されていない場合に問題が発生する場合は、別の問題が発生している可能性があります。-viewWillAppearが呼び出された後、子View Controllerが完全に「アクションの準備ができている」ことを確認します(これは、親の-viewWillAppearから手動で呼び出すこともできます) 。

于 2009-09-22T17:59:03.090 に答える
0

これは私が手動で呼び出す方法ですviewWillAppear、、、:ここviewDidAppearviewWillDisappearviewDidDisappear

そして、私がこの方法でロードしたビューコントローラの1つには、次のものがありますviewWillAppear:(これはviewWillAppear、呼び出された時点でviewDidAppear、ユーザーがビューを表示できるためです)。

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [wordListTable reloadData];
    [wordListTable scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionMiddle animated:NO];
}
于 2009-09-23T08:14:02.417 に答える