0

私はこれについて見つけることができるほぼすべての投稿を調査し、いくつかの助けを借りることができるようになりました。

私のプロジェクトは、ストーリーボードを使用して構築されたユニバーサルアプリです。iPadバージョンはスプリットビューコントローラーを使用します。マスタービューリレーションシップは、ビューコントローラーを備えたナビゲーションコントローラーです。詳細ビューは、ビューコントローラーを備えたナビゲーションコントローラーです。

気付かずに、iPad5.1シミュレーターを使用してアプリをビルドしてテストしました。その細部に気づき、iOS 5.0との互換性が必要になったので、私はios5.0でテストを開始しました。

2つの大きな変更が発生しました:a)分割ビューは5.1.1のように全画面ではなくポップオーバーで表示されます(私は実際にはポップオーバーが好きです)b)プログラムで非表示にして表示するコードは5.1で問題なく機能しました5.0では機能しません-「show」は実際にアプリをクラッシュさせます。向きの変更だけに依存するのではなく、UIを補完するために、ポップオーバーを表示/非表示にするいくつかのメソッドを作成しました。たとえば、showメソッドを使用して、ポップオーバーを縦向きで画面に配置しましたが、テーブルビューなどを選択した後でポップオーバーを削除しました。

だから、多分誰かが助けることができます。詳細と質問は次のとおりです。ご協力いただきありがとうございます。

iOS 5.1-ポップアップを表示-splitviewコントローラーのデリゲート呼び出しを使用してポップオーバーボタンへの参照を取得し、ボタンアクションを使用してメソッドからポップオーバーを表示します。これは5.1では完全に機能しますが、5.0ではこのエラーが発生しました。エラー:ウィンドウのないビューからポップオーバーを表示することはできません。(私はこのエラーを検索しましたが、多くの参照がありますが、私の構成に対する具体的な答えはありません)。さらに、5.0ではなく5.1で使用できるウィンドウがあるのはなぜですか?

//show master view popover
[self.masterPopoverController presentPopoverFromBarButtonItem:self.showMasterViewButton permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];

//get the reference from the button
- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController 
{  
self.showMasterViewButton = [[UIBarButtonItem alloc]initWithTitle:nil style:UIBarButtonItemStyleDone target:barButtonItem.target action:barButtonItem.action];
}

ここでの最初の観察は、ボタンが実際には5.0と5.1の両方で使用可能であり、ナビゲーションバーを表示して機能することです。ただし、コードで同じボタンを参照すると、5.0でクラッシュが発生し、5.1で機能します。どうしてか分かりません。

iOS5.0でそれを隠すための同じ問題。iOS 5.1では、次のアプローチを使用します。

    if (self.masterPopoverController) {
    [self.masterPopoverController dismissPopoverAnimated:YES];
}

self.masterPopoverControllerは、上記と同じsplitviewデリゲートコールバックに設定されます。これはiOS5.1では完璧に機能しますが、iOS5.0では何もしません

注-更新:リストした最初の問題を解決するための回答をここで見つけました:https ://github.com/mattgemmell/MGSplitViewController/pull/31リスト した最初の問題を修正します。

//grab a reference to the popover controller in the split view delegate call
//splitview ... willHideViewController
self.masterPopoverController = popoverController;

//then add the following to a method and call it when you need it
//this fixes the no window issue in iOS 5.0
[self.masterPopoverController presentPopoverFromRect:CGRectZero inView:[[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  • 2番目の質問は、ポップオーバーがスライドインに変更された理由と、iOS5.1で元に戻すことができる理由です。私は実際に私のアプリのiOS5.0のポップオーバー効果が好きですが、代わりにポップオーバーを使用するようにスライドを変更することはできません。ポップオーバーのコンテンツサイズを複数の場所で変更するために多くのアプローチを試しましたが、分割ビューのポップオーバーには影響がないようですが、他のその他のコードでも同様のコードが正常に機能します。ボタンのポップオーバー。

私はこれを見逃したに違いありませんが、アップルが意図的にこれを行ったと思いますが、オーバーライドする方法があるはずですか?

注:ios5.1でios5.0の動作をエミュレートするための解決策または少なくとも方法を見つけました

UIViewControllerを保持するプロパティと、UIPopoverControllerを保持するプロパティを作成します

次に、分割ビューデリゲートコールバックでマスタービューコントローラーのコピーを取得します

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController { 

self.copyOfMasterViewController = viewController;
}

次に、次のようなメソッドをプロジェクトに追加します。

-(void)showsPopover {
  self.ios51popover = [[UIPopoverController alloc]initWithContentViewController:self.masterViewInPopover];

 [self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
 [self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

-(void)hidesPopover {[self.ios51popover dismissPopoverAnimated:YES]; }

今、あなたは両方を持っています。

4

1 に答える 1

0

この最初のスニペットは、iOS5.0および5.1で機能する分割ビューでポップオーバーをプログラムで表示する方法を示し、ウィンドウのないビューからポップオーバーを表示できない問題を修正します。注-更新:リストした最初の問題を解決するための回答をここで見つけました:https ://github.com/mattgemmell/MGSplitViewController/pull/31リストした最初の問題を修正します。

//分割ビューデリゲート呼び出しでポップオーバーコントローラーへの参照を取得します//splitview... willHideViewController

self.masterPopoverController = popoverController;

//次に、メソッドに以下を追加し、必要に応じて呼び出します//これにより、iOS5.0でウィンドウが表示されない問題が修正されます;

この次のスニペットは、AppleがiOS 5.1で実際に使用したスライドではなく、ios5.0スタイルで実際のポップオーバーを表示する方法を示しています。

注:更新:iOS5.1でios5.0の動作をエミュレートする解決策または少なくとも方法を見つけましたUIViewControllerを保持するプロパティとUIPopoverControllerを保持する別のプロパティを作成します

次に、分割ビューデリゲートコールバックでマスタービューコントローラーのコピーを取得します

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)newpopoverController { 

self.copyOfMasterViewController = viewController;
}

次に、次のようなメソッドをプロジェクトに追加します。

-(void)showsPopover {
  self.ios51popover = [[UIPopoverController   alloc]initWithContentViewController:self.copyOfMasterViewController];

 [self.ios51popover setPopoverContentSize:CGSizeMake(320, 580) animated:NO];
 [self.ios51popover presentPopoverFromRect:CGRectMake(50, 55, 1, 1) inView: [[UIApplication sharedApplication] keyWindow] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}

-(void)hidesPopover { [self.ios51popover dismissPopoverAnimated:YES]; }
于 2012-08-25T22:07:19.517 に答える