17

UISplitViewController に基づいて iPad アプリを作成しています。私のアプリがPortraitで起動されたとき、ツールバーボタンに少し問題があります。ポップオーバーを表示するボタンが表示されません。ただし、iPadを横向きに回転させてから縦向きに戻すと、ボタンが表示されます!

次のメソッドは起動時に呼び出されないようです (これは、ボタンを表示するコードがある場合です)。

- (void)splitViewController:(UISplitViewController *)svc willHideViewController:(UIViewController *)aViewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController: (UIPopoverController *)pc

このメソッドは、アプリの起動時に呼び出されるのではなく、ローテーションが発生したときにのみ呼び出されます。さらに奇妙なのは、Xcode UISplitViewController テンプレート + コア データを使用してテスト アプリを作成したことです (これは、私が取り組んでいるアプリに似ており、このアプリを作成するために使用したテンプレートです)。コードを1行も作成していないテストアプリでは、アプリを縦向きモードで起動するとボタンが表示され、他のアプリとは対照的に、起動時に上記のメソッドも呼び出されます。誰かが同様の問題を抱えていましたか?

最後に、 UISplitViewControllerが最初に表示されたときにこのメソッドが呼び出されるかどうかは、アップルのドキュメントからはあまり明確ではありません。 Reference.html%23//apple_ref/doc/uid/TP40009454

4

6 に答える 6

23

「Kshitiz」には正しいコンセプトがあります。最初に、viewDidLoad メソッドで self.splitviewController.delegate = self を設定しましたが、この委譲を設定するには少し遅れています。そこで、初期段階の awakeFromNib メソッドで委譲を設定してみました。それからそれはうまくいきます。

そのため、viewDidLoad によってビューが既に読み込まれている場合、委任は機能しません。いくつかのアクティビティ (iPad の回転など) の後、しばらくすると機能します。したがって、viewDidLoad より前の段階は awakeFromNib です。

動作するコードは次のとおりです。

- (void) awakeFromNib{
    [super awakeFromNib];
    self.splitViewController.delegate = self;
}
于 2012-02-13T04:12:47.547 に答える
1

splitviewcontrollerデリゲートを設定しましたか?一般に、デリゲートが設定されていない場合に問題が発生します。

于 2011-05-02T10:39:45.703 に答える
0

私はかなり長い間これに行き詰まりました。最後にそれを機能させました。awakeFromNib はうまくいきませんでした。didFinishLaunchingWithOptions が実行しました。ポップオーバー コントローラーに項目を設定するクエリを実行していることが原因である可能性があります。

于 2012-08-30T02:03:53.740 に答える
0

私は同じ問題を抱えています。私のビューは IB で設定されていますが、これはタイミングの問題のようです。分割ビュー デリゲートは、分割ビューが最初の向きの「変更」について通知した後に設定されます。アプリデリゲートのアウトレットに分割ビューを追加すると、ポートレートの起動時にボタンが表示されましたが、ポップアップを開くと空です。これはおそらく何とか回避できますが、分割ビューが設定されているときに現在の向きについてデリゲートに通知しないのは奇妙だと思います。

于 2011-07-04T08:00:26.763 に答える
0

私はまったく同じ問題を抱えていましたが、Martin Gunnarsson の回答が解決策につながりました。

以前は、デリゲート ビュー (詳細ビュー) が既に読み込まれてから、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;
}
于 2011-11-11T17:18:52.947 に答える
0

すぐに使用できる splitViewController を使用して 2 つの iPad プロジェクトに取り組んでおり、最初のプロジェクトには常に「マスター」ボタンが表示されますが、2 番目のプロジェクトには表示されませんでした。私は斜視になるまでアウトレットと関係とデリゲートを比較しましたが、最終的に appDelegate で答えを見つけました。application:didFinishLaunchingWithOptions:、特に splitViewController.delegate が設定されている場所でコメントアウトしすぎたことが判明しました。

- (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でデリゲートを接続しようとしましたが、何らかの理由でそれがありませんでした。ストーリーボードの設計上の欠陥、私見。

于 2012-05-08T09:57:57.900 に答える