0

私は本当に単純なことをしています。ViewController をプッシュしようとしています。iPhone では問題なく動作しますが、iPad ではクラッシュします。SIGABRT:

libsystem_kernel.dylib`__pthread_kill:
0x35d85324:  mov    r12, #328
0x35d85328:  svc    #128
0x35d8532c:  blo    0x35d85344                ; __pthread_kill + 32
0x35d85330:  ldr    r12, [pc, #4]             ; __pthread_kill + 24
0x35d85334:  ldr    r12, [pc, r12]
0x35d85338:  b      0x35d85340                ; __pthread_kill + 28
0x35d8533c:  stmibeqr4, {r5, r6, r7, r10, r11}
0x35d85340:  bx     r12
0x35d85344:  bx     lr

何かご意見は?ありがとうございました!

Principal *cvc;

NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
} else {
    cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
}

[cvc setImg:flippedImage];

if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {

    [self.navigationController pushViewController:cvc animated:YES];

} else {

    [self.navigationController pushViewController:cvc animated:YES];

}

[cvc release];
4

4 に答える 4

2

UI Interface Idiom を確認する方がはるかに簡単だと思います。

    Principal *cvc;
    if(UI_USER_INTERFACE_IDIOM() = UIUserInterfaceIdiomPhone) {
        cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
    } else {
        cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    }
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release];

さらに、最後のステートメントの両方のケースで同じことを行っているifため、コードで行ったように削除できます。

さらに役立つように、クラッシュの前にスローされた実際の例外テキストを確認する必要があります。

self.navigationControlleriPhone では定義されているが iPad では定義されていない問題、または iPad に使用される初期化子がnilVC を返し、 nilView Controller をプッシュすると例外がスローされることが問題であると想像できます。

于 2012-08-30T00:24:09.703 に答える
1

これには何か問題があります。

Principal *cvc;
NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
} else {
    cvc = [[Principal alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    // This should be allocated with the class Principal_iPad not Principal.
}

それはこのようなものでなければなりません、

NSString *deviceType = [UIDevice currentDevice].model;
if([deviceType isEqualToString:@"iPhone"] || [deviceType isEqualToString:@"iPod touch"]) {
    Principal *cvc = [[Principal alloc] initWithNibName:@"Principal" bundle:nil];
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release]
} else {
    Principal_iPad *cvc = [[Principal_iPad alloc] initWithNibName:@"Principal_iPad" bundle:nil];
    [cvc setImg:flippedImage];
    [self.navigationController pushViewController:cvc animated:YES];
    [cvc release]
}
于 2012-08-30T00:23:53.023 に答える
0

存在できないいくつかの接続のような xib に問題がある可能性があります (通常、xib 要素をコピーしてセレクターを削除するのを忘れた場合など)。次のコードを appDelegate に追加すると、スタック トレースを見つけることができます。

void uncaughtExceptionHandler(NSException *exception) {
   NSLog(@"CRASH: %@", exception);
   NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
   // Internal error reporting
}

上記のメソッドは、あなたの最初のものでなければなりませんappDelegate.m

次に、次のようにメソッドNSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);の最初の行として追加します。application:didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);//should be the first line
    ....
    ....
}
于 2012-08-30T05:31:05.387 に答える
0

実際の例外を取得するには、設定する必要がありますNSZombieEnabled。設定するにはNSZombieEnabled、Product->Edit Scheme->Arguments に移動します Arguments では、ここに「環境変数」が表示されます。+記号をクリックして追加NSZombieEnabledし、その横にあるチェックボックスをオンにします。次に、例外を確認できます。問題は NavigationController にあるのではないかと思いました。PricipalViewController にある可能性があります。 PrincipalViewController に breakPoints を配置して確認してくださいViewDidLoad

于 2012-08-30T04:41:00.453 に答える