1

注:この質問を読む前に、アップルのUISplitViewControllerの実装に関する欠陥と、オープンソースの「MGSplitViewController」をどのように使用すべきかを説明する以前の質問を読んだことに注意してください。ランドスケープ モードでビュー コントローラーを分割します。iOS 5.1 では通常の UISplitViewController の使用に限定されていることに注意してください。

質問に移ります:

左側にテーブル ビュー (マスター ビュー) があり、右側に詳細ビュー コントローラーがある分割ビュー コントローラーがあります。別のテーブル ビュー ("DataTableViewController") に遷移するテーブル ビューである左側を制御するために、ナビゲーション コントローラーを使用しています。この左側を非表示にするために、詳細ビュー コントローラーのナビゲーション ツールバーに「非表示」ボタンを配置しました。非表示ボタンが押されたら、「_hideMaster」プロパティを変更します。

-(IBAction)hidePressed
{
    _hideMaster = !_hideMaster;
    // Must manually reset the delegate back to self in order to force call "shouldHideViewController"
    self.splitViewController.delegate = nil;
    self.spliteViewController.delegate = self;

}

次に、SplitViewController デリゲートでこのメソッドが自動的に呼び出されます。

// This is called when I change the delegate from nil back to self.
- (BOOL)splitViewController: (UISplitViewController*)svc shouldHideViewController: (UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{
    return _hideMaster;
}

デバッグすると、すべてが計画どおりに進み、プロパティがメソッドに入ると正しい値になることがわかりますsplitViewController:shouldHideViewController:inOrientation:

唯一の問題は、何も起こらないことです。一番左のテーブル ビュー ( DataTableViewController) が消えません。よく見る(UIViewController *)vcと、デリゲート メソッドのパラメーターは、非表示にするテーブル ビュー コントローラーではなく、このテーブル ビューに関連付けられているナビゲーション コントローラーです。したがって、基本的にはナビゲーションコントローラーを非表示にしようとしています-これは明らかに私が望んでいるものではありません...

shouldHideViewController:自動的に呼び出されるデリゲート メソッド ( ) の UIViewController パラメータが、そのナビゲーション コントローラに関連付けられた最上位のビュー コントローラを呼び出すようにするにはどうすればよいですか? (やっぱり隠したいDataTableViewController)

4

1 に答える 1

1

これが私がそれを処理する方法です。途中でインスタンス化されていない場合、MasterViewController を再表示するには、さらに作業が必要になる場合があります。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.30f];
[[self.splitViewController.viewControllers lastObject] view].frame = self.splitViewController.view.frame;
[UIView commitAnimations];
于 2012-10-20T20:58:27.910 に答える