9

私は、分割ビューのマスター ペインと詳細ペインにプレーンのある a のUISplitViewController内側を使用しています。UITabBarControllerUIViewControllerUINavigationControllerUIViewController

Apple がルート レベルでのみ分割ビューを使用するようにアドバイスしていることは承知していますが、タブで分割ビューを使用する他のアプリケーション (Amazon の [ウィッシュ リスト] タブなど) を見たので、それが可能であると確信しています。

私の問題は、分割ビューのデリゲート メソッドです。のものUISplitViewControllerDelegateが呼び出されないため、ポートレート モードに切り替えたときにポップオーバー メニューを作成できません。

問題の方法は次のとおりです-

// Called when a button should be added to a toolbar for a hidden view controller
- (void)splitViewController: (UISplitViewController*)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem*)barButtonItem forPopoverController: (UIPopoverController*)pc;

// Called when the view is shown again in the split view, invalidating the button and popover controller
- (void)splitViewController: (UISplitViewController*)svc willShowViewController:(UIViewController *)aViewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem;

// Called when the view controller is shown in a popover so the delegate can take action like hiding other popovers.
- (void)splitViewController: (UISplitViewController*)svc popoverController: (UIPopoverController*)pc willPresentViewController:(UIViewController *)aViewController;

はローテーション通知を受け取りますUISplitViewController

アプリの起動時にステータス バーの向きを強制的に右 (または左) にすると、 willShowViewControllerメソッドを呼び出すことができます。

 [[UIApplication sharedApplication] setStatusBarOrientation:UIInterfaceOrientationLandscapeRight];

ただし、 はwillHideViewController呼び出されません。また、アプリを強制的に横向きで起動したくありません。同じことをして強制的に縦向きにすると、コールバックが届きません。

分割ビュー コントローラーがデリゲート メソッドを呼び出さない理由がわかりません。それ以外の場合は正しく動作しています。これらのメソッドは、そのメソッドから呼び出す必要があります-

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

内部でブレークポイントを設定すると、デリゲートが設定されていて、まだ有効であることを確認できます。

一日中これにこだわっています!他のすべてはうまく機能しており、splitview / tabbar / navbar の組み合わせがうまく機能していることを非常に嬉しく思います. これらの通知が必要です。

回転するときに手動で呼び出す必要がありますか? `UISplitViewController' がこれを行う必要がある場合、非常に間違っているようです。

4

3 に答える 3

6

解決済み。ルート レベルか、ルート レベルにある必要がある tabBar の直接のサブビューのいずれかである必要があります。迷惑!

于 2011-01-18T17:29:05.110 に答える
3

まず、正しいデリゲートを設定しているかどうかを確認してください。たとえば、3 つのコントローラーを作成したとします。

UISplitViewController* splitView;
UIViewController* masterView;
UIViewController* detailView;

デリゲート プロトコルを詳細ビューに実装したので、向きが変わったときに詳細ビューでツールバーにボタンを配置できるようになりました。

splitView がデリゲートからこの関数を呼び出すには、デリゲート自体を設定する必要があります。

したがって、どこかで、次の呼び出しが欠落している場合は、

splitView.delegate = detailView;

detailView は、向きの変更などの通知を受け取ることはありません。少なくとも、これは私が行き詰まった場所です。

于 2012-01-06T15:43:17.973 に答える
2

マスター UIViewController からディテール UIViewController にメッセージを送信する次の方法が気に入っています。マスターの実装内のどこか:

id detailViewController = [[self.splitViewController viewControllers] lastObject];
[detailViewController setSomeProperty:…];

これは、Paul Hegarty の Fall 2011 Stanford iTunesU iPad and iPhone Application Development コースからのものです。

于 2012-12-09T06:18:54.783 に答える