0

このカスタム セグエは視覚的には正しく機能しますが、完了すると警告が表示されます。

Warning: Attempt to present <DestViewController: 0x21059f40> on <SrcViewController: 0x1fd50cf0> whose view is not in the window hierarchy!

警告なしでこれを機能させる方法についての助けをいただければ幸いです。これに必要以上の時間を費やしました。警告なので、気にする必要があるかどうかさえわかりません。

- (void)perform {
    UIViewController *src = (UIViewController *)self.sourceViewController;
    UIViewController *dst = (UIViewController *)self.destinationViewController;

    dst.view.alpha = 0;

    [UIView animateWithDuration:0.5
                 animations:^{
                     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                     [src.view addSubview:dst.view];
                     dst.view.alpha = 1;
                 }
                 completion:^(BOOL finished){
                     [dst.view removeFromSuperview];
                     //need to understand why this throws a warning but still works
                     [src presentViewController:dst animated:NO completion:^(){
                         [src reset];
                     }];
                 }];
}

アップデート

src UIViewController のリセット メソッドで、MPMoviePlayerController を停止するための呼び出しがありました。問題を引き起こしていた何らかの理由で、このセグエを削除すると完全に機能します。セグエの最終的な実装については、以下の私の回答を参照してください。

4

2 に答える 2

0

上記のように、元の問題はセグエ以外の何かによって引き起こされましたが、ここにたどり着く可能性のある他の人のために、完全に機能するセグエコードを投稿すると思いました。この例のデリゲートは、次の方法で子 UIViewContainers が子として追加されたカスタム UIViewController コンテナーです。

[self addChildViewController:childController_];
[self.view addSubview:childController_.view];

segue.h

#import <UIKit/UIKit.h>

@interface COFSimpleSegue : UIStoryboardSegue

@property (assign) UIViewController *delegate;

@end

segue.m

#import "COFSimpleSegue.h"
#import <QuartzCore/QuartzCore.h>

@implementation COFSimpleSegue

@synthesize delegate = delegate_;

- (void)perform {
    UIViewController *src = (UIViewController *)self.sourceViewController;
    UIViewController *dst = (UIViewController *)self.destinationViewController;

    dst.view.frame = delegate_.view.bounds;
    dst.view.autoresizingMask = delegate_.view.autoresizingMask;

    [src willMoveToParentViewController:nil];

    [delegate_
       transitionFromViewController:src
       toViewController:dst
       duration:0.5f
       options:UIViewAnimationOptionTransitionCrossDissolve
       animations:^(void){}
       completion:^(BOOL finished) {
         [dst didMoveToParentViewController:delegate_];
         [src removeFromParentViewController];
       }
    ];
}

@end
于 2013-02-14T22:30:17.043 に答える
0

スーパービュー、つまり src.view からビューを削除し、その後に同じ viewController を提示しているため、警告が表示されています。

これを試してください(これが機能しない場合は教えてください):

[UIView animateWithDuration:0.5
                 animations:^{
                     [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
                     dst.view.alpha = 1;
                 }
                 completion:^(BOOL finished){
                     [src presentViewController:dst animated:NO completion:^(){
                         [src reset];
                     }];
                 }];
}
于 2013-01-21T10:34:17.517 に答える