21

取得したコードをコンパイル中に

"外観遷移の開始/終了の不均衡な呼び出し<UINavigationController: 0xa98e050>"

警告。

これが私のコードです

KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
passcodeController.delegate = self;

UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:YES];
4

5 に答える 5

63

これは古い質問であることはわかっていますが、これに再び出くわした人のために、ここに私が見つけたものがあります.

viewControllerまず、質問には、 newが呼び出された場所が記載されていません。
これはから呼び出されたと思われます-(void)viewDidLoad

適切なコードをに移動する-(void)viewDidAppear:と、問題は解決するはずです。

これは、 で-viewDidLoadビューがロードされましたが、まだ表示されておらず、アニメーションとビューが完了していないためです。

ウィンドウをプッシュすることが意図されている場合は、ウィンドウが表示され、ペイントされた後に実行してください。

タイマーを使用してシステムの動作を制御していることに気付いた場合は、何が間違っているのか、またはより適切に行うにはどうすればよいかを自問してください。

于 2013-12-02T01:06:11.080 に答える
18

前のトランザクション (アニメーション) の進行中に新しいビュー コントローラーをプッシュしようとすると、この問題が発生することがわかりました。

とにかく、それはpresentModalViewController問題だと思います、 Setanimated:NOあなたの問題を解決するかもしれません

[(UIViewController *)self.delegate presentModalViewController:passcodeNavigationController animated:NO];

その他のオプションは次のとおりです。

NSTimer上記のコードを取得して呼び出すまでの時間は、0.50 ~ 1秒です。これも役立つトリックです。したがって、以前のviewControllerはアニメーションを実行しました。

于 2013-01-19T09:35:26.923 に答える
3

現代の解決策はこれかもしれません:

double delayInSeconds = 0.5;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds *   NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self.window.rootViewController presentViewController:yourVC animated:YES completion:nil];
});
于 2013-11-16T11:50:58.457 に答える
1

多くのコンテキストを提供しなかったため、パスコード ビュー コントローラーを提示しているため、起動時にこのエラーが発生していると思われます。

この警告を取り除くために、アプリ デリゲートをナビゲーション ルート ビュー コントローラーのデリゲートとして登録します。

- (BOOL) application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    ((UINavigationController *)self.window.rootViewController).delegate = self;
    return YES;
}

次に、モーダル ビュー コントローラーを次のように提示しnavigationController:didShowViewController:animated:ますdispatch_once

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    static dispatch_once_t once;
    dispatch_once(&once, ^{
        KVPasscodeViewController *passcodeController = [[KVPasscodeViewController alloc] init];
        passcodeController.delegate = self;

        UINavigationController *passcodeNavigationController = [[UINavigationController alloc] initWithRootViewController:passcodeController];
        [(UIViewController *)self.delegate presentViewController:passcodeNavigationController animated:YES completion:nil];
    });
}

navigationController:didShowViewController:animated:はルート ビュー コントローラーが表示された後に呼び出されるため、外観遷移の開始/終了への呼び出しのバランスが取れていないという警告はなくなりました。

于 2015-01-22T11:08:34.797 に答える