1

UINavigationControllerカスタムUIViewControllerサブクラスでを初期化します。しかし、View Controller を表示しようとするとすぐにSIGABRT、Xcode でエラーが発生します。これまでに何度もこれを行ってきましたが、現在のプロジェクトで正しくない可能性がある他のことが原因で、この問題が存在すると思います。しかし、この現象の背後にある問題を見つけるのは非常に難しいと思います。では、何らかの形でモーダル ビュー コントローラーの表示を防ぐためにできることはありますか?

これは、View Controller を提示する方法です。

- (IBAction)tutorialTouched:(id)sender {

    TutorialViewController *tutorialVC = [[TutorialViewController alloc]init];
    UINavigationController *nav = [[UINavigationController alloc]initWithRootViewController:tutorialVC];
    nav.modalPresentationStyle = UIModalPresentationFormSheet;

    // This line leads to `SIGABRT`
    [self presentModalViewController:nav animated:NO];
}

展開ターゲットは 5.0 です。

更新: これはbt、コンソールに入力したときに得られる情報です。

#0  0x945919c6 in __pthread_kill ()
#1  0x9645bf78 in pthread_kill ()
#2  0x9644cbdd in abort ()
#3  0x003169dc in uncaught_exception_handler ()
#4  0x032010fc in __handleUncaughtException ()
#5  0x02f00f0f in _objc_terminate ()
#6  0x0349e8de in safe_handler_caller ()
#7  0x0349e946 in std::terminate ()
#8  0x0349fb3e in __cxa_rethrow ()
#9  0x02f00e15 in objc_exception_rethrow ()
#10 0x03137de0 in CFRunLoopRunSpecific ()
#11 0x03137c9b in CFRunLoopRunInMode ()
#12 0x035ca7d8 in GSEventRunModal ()
#13 0x035ca88a in GSEventRun ()
#14 0x016b3626 in UIApplicationMain ()
#15 0x00002fad in main (argc=1, argv=0xbffff5a8) at /Users/myProject/main.m:14
4

4 に答える 4

3

The problem was caused due to an Outlet error inside my ViewController. I could not figure it out because the compiler never told me this. Only when I added a try / catch around the presentation of the view controller did I get the exception object, which finally told me what was wrong. Sorry for the confusion and thanks for your help.

于 2012-04-23T13:49:35.203 に答える
2

ブロックは 4.0 で導入されたため、下位の iOS のデバイスでブロックを使用すると、SIGABRT を受け取ります。RespondsToSelector とフォールバック メソッドを使用して、存在するかどうかを確認します。

if([self respondsToSelector:@selector(presentViewController:animated:completion:)]){
        [self presentViewController:nav animated:YES completion:^{}];
}else{
    [self presentModalViewController:nav animated:YES];
}
于 2012-04-23T12:31:03.427 に答える
1

NSInvalidArgumentExceptioniOS 4.x シミュレーターでアプリを実行している場合、などの理由で SIGABRT でクラッシュしunrecognized selector sentます。その理由は、presentModalViewController:animated:completion:iOS 5.0 より前には存在しないためです。

presentModalViewController:animated:以前のバージョンの iOS に使用します。iOS 5.0 では非推奨としてマークされているため、将来のメンテナンスのためにこれを行うことができます。

if ([self respondsToSelector:@selector(presentViewController:animated:completion:)]) {
    [self presentViewController:nav animated:YES completion:^{}];
} else {
    [self presentModalViewController:nav animated:YES];
}

詳細については、 UIViewController クラス リファレンスを参照してください。

于 2012-04-23T12:36:42.887 に答える
0

答えは簡単です。ブロック コードを削除し、最後の行を次のように変更します。

[self presentModalViewController:nav animated:YES];

Nav では、ViewDidLoad を使用して追加のコードを実行できます

なぜクラッシュするのですか?

UIViewController の presentViewController:animated:completion: メソッドが iOS 4.3 で使用できないため、クラッシュします。これは iOS 5 で導入されました。コードは iOS < 5.0 用に設定されている可能性が高く、クラッシュします - QED

于 2012-04-23T12:26:14.743 に答える