uisplitviewcontrollerポートレートを起動するときにポップアップボタンを表示しない
-
27-10-2019 - |
質問
uisplitviewcontrollerに基づいてiPadアプリを行っています。アプリがPotraitで起動したとき、Toobarボタンに少し問題があります。ポップオーバーを表示するボタンが表示されません。ただし、iPadを風景に回転させてからポートレートに戻ると、ボタンが表示されます!
次の方法は起動時に呼び出されないようです(これは、ボタンを表示するコードがある場合です):
- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc
この方法は、アプリが起動するときは呼び出されませんが、回転がある場合にのみ呼び出されます。さらに奇妙なことに、Xcode UisplitViewController Template + Core Data(これは私が取り組んでいるアプリに似ており、このアプリを作成したテンプレートです)を使用してテストアプリを作成したことです。単一のコードを作成していないテストアプリでは、ポートレートモードでアプリを起動するときにボタンが表示され、上記の方法は他のアプリとは対照的に起動時にも呼び出されます。誰かが同様の問題を抱えていましたか?
最後に、UisplitViewControllerが最初に示されたときにこの方法が呼び出されることになっているかどうかは、Appleのドキュメントからそれほど明確ではありません。http://developer.apple.com/library/ios/#documentation/uikit/reference/uisplitviewcontrollerdelegate_protocol/reference/reference.html%23//apple_ref/doc/uid/tp40009454
解決
「Kshitiz」には正しい概念があります。最初に、self.splitviewcontroller.delegate = selfをviewdidloadメソッドに設定しました。そこで、私は以前の段階で代表団を設定しようとしました。その後、うまく機能します。
そのため、問題はviewDidloadによってすでにロードされているビュー後に、代表団が機能しないことです。いくつかのアクティビティ(iPadの回転など)の後も機能します。したがって、ViewDidloadよりも初期の段階はAwakeFromnibです。
これが機能するコードです:
- (void) awakeFromNib{
[super awakeFromNib];
self.splitViewController.delegate = self;
}
他のヒント
SplitViewController Delegateを設定しましたか?一般に、代表者が設定されていない場合に問題が発生します。
私はまったく同じ問題を抱えていましたが、マーティン・ガンナーソンの反応は解決策につながりました。
以前は、Delegate View(The Detail View)がすでにロードされていた後、UisplitViewControllerのデリゲートプロパティを設定していました。 viewDidLoad:
. 。この時までに、uisplitviewcontrollerはすでに最初のものを送信していました splitViewController:willHideViewController:withBarButtonItem:forPopoverController:
メッセージ。私は単にデリゲートをすぐに設定していませんでした。
解決策は、メインアプリデリゲートに代表者を割り当てることでした。 application:DidFinishLaunchingWithOptions:
. 。この場合、私の代表者はナビゲーションコントローラーに含まれていたため、1つのレイヤーをより深く掘り下げて取得する必要がありました。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *mainNavigationController = (UINavigationController *)[splitViewController.viewControllers objectAtIndex:1];
HPMainViewController *mainViewController = [mainNavigationController.viewControllers objectAtIndex:0];
splitViewController.delegate = mainViewController;
return YES;
}
これは私にも予備を捧げましたが、すぐに使用できるSplitViewControllerを使用して2つのiPadプロジェクトに取り組んでいるので、最初のプロジェクトには常に「マスター」ボタンが表示されますが、2番目のIPADボタンは常に「マスター」ボタンを表示します。私は、私が視ろされるまでアウトレットと関係と代表者を比較しましたが、最終的にAppDelegateで答えを見つけました。アプリケーションで少しコメントしすぎていることが判明しました。特にsplitviewController.delegateが設定されている場所で、didfinishlaunching withoptions:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
UINavigationController *navigationController = [splitViewController.viewControllers lastObject];
splitViewController.delegate = (id)navigationController.topViewController;
}
これをAppDelegateに追加すると、SplitViewControllerをサブクラス化する必要がなくなります。また、IBでデリゲートを接続してみましたが、何らかの理由でそれはありませんでした。ストーリーボードのデザインの欠陥、私見。
私はかなり長い間これに立ち往生していました。ついにそれを機能させました。 Awakefromnibは私のために働きませんでした。 Didfinishlaunchingingwithoptionsはそうしました。ポップオーバーコントローラーのアイテムを入力するクエリを実行しているからかもしれません。
私は同じ問題を抱えています。私の見解はIBで設定されており、これはタイミングの問題のようです。スプリットビューデリゲートは、スプリットビューが初期オリエンテーション「変更」について通知した後に設定されます。アプリのデリゲートのアウトレットに分割ビューを追加すると、ポートレートスタートアップでボタンが表示されましたが、ポップアップを開くと空になります。これはおそらく何らかの形で解決することができますが、スプリットビューが設定されたときに現在の方向について代表者に通知しないのは奇妙だと思います。