2017-03-21 4 views
0

私はビュー・コントローラーを持っています。 viewDidAppearからanimated:NOと表示されている場合は、2回目の表示時にその内容は表示されません。私はこれに問題を細分化しました:私はストーリーボードにセグの2つのコントローラーを追加しました。それぞれは同じポップオーバーコントローラーをviewDidAppearに表示します。 それらのそれぞれの同じクラスのインスタンスである:モーダル・ポップ・オーバー・コントローラーは、viewDidAppearから提示されたときにコンテンツを表示しません。

#import "ViewController.h" 
#import "PopupViewController.h" 

@interface ViewController() <UIPopoverPresentationControllerDelegate> 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self showPopover]; 
} 

-(UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller traitCollection:(UITraitCollection *)traitCollection { 
    return UIModalPresentationNone; 
} 

- (void)showPopover { 
    PopupViewController* popoverController = [[PopupViewController alloc] initWithNibName:NSStringFromClass([PopupViewController class]) bundle:nil]; 
    popoverController.modalPresentationStyle = UIModalPresentationPopover; 
    popoverController.preferredContentSize = CGRectInset(self.view.bounds, 20, 100).size; 
    popoverController.popoverPresentationController.sourceView = self.view; 
    popoverController.popoverPresentationController.sourceRect = CGRectMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds), 0, 0); 
    popoverController.popoverPresentationController.permittedArrowDirections = 0; 
    popoverController.popoverPresentationController.delegate = self; 
    [self presentViewController:popoverController animated:NO completion:nil]; 
} 

@end 

ポップオーバーは、アプリの起動時に正しく提示したが、第2のビューコントローラをプッシュで、ボタンをタップし、バックに空になっています。 animatedYESに変更すると、ポップオーバーが正しく表示されます。

編集:私はXcodeでビュー階層をデバッグする場合は、彼らがする必要がありますように、ビューはすべてのフレームと、正しく表示されます。

View hierarchy

これは、デバイス(正しいポップオーバーにどのように見えるかです左は空、右は空)。 Example

+0

'viewDidDisappear'のように、2番目のView Controllerを押すと、Popoverが削除されますか? – dmorrow

+0

2番目のビューコントローラに行く前に、その周囲の影をタップしてポップオーバーを解除します – pckill

+0

最初のポップオーバーが消えるのを待っていますか?あなたのコンソールに警告がありますか? – Sulthan

答えて

1

この問題は簡単に再現できます。私はイベントのロギングを開始しました。これは、UINavigationControllerがアニメーションを処理する方法によって引き起こされたようです。

viewDidAppearがプッシュされたコントローラのために呼び出されると、アニメーションはまだ完了していません。 UINavigationControllerDelegatenavigationController:didShowViewControllerメソッドをチェックすることで、自分自身で確認できます。第二のコントローラがさえ完全にviewDidAppear:に親に移動されていないことを

Navigation controller will show VC 1 
VC 1 did layout subviews 
VC 1 did layout subviews 
VC 0 did move to parent <UINavigationController: 0x7feaf181ec00> 
VC 1 did appear 
VC 1 did move to parent <UINavigationController: 0x7feaf181ec00> 
Navigation controller did show VC 1 

注:

イベント・ログには、次のようになります。

私が見つけた唯一の実行可能な回避策は次のとおりです。ナビゲーションコントローラは、その内部の作業を完了するようになる

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self showPopover]; 
    }); 
} 

アニメーションなしでプッシュするときに問題が発生しないように注意してください。これはおそらく、別のアニメーション補完ブロックからのアニメーションのないビューコントローラを表示しようとしているためです。 。 dispatch_asyncを追加すると、コードが完了ブロックから移動し、すべてが正しく機能し始めます。

+0

ありがとう、このように問題が解決されたようです。 – pckill

関連する問題