0

ユーザーが iPhone 5 の画面を使用しているかどうかをアプリに検出させようとしています。

私は他のビューで次の方法をうまく使用しています。

ボタンを介して、ロードする Xib / ビューを呼び出します

- (IBAction)DemoTapeTwo:(id)sender {

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    DemoTapeTwoViewController *Second = [[DemoTapeTwoViewController alloc] initWithNibName:nil bundle:nil];
    [self presentViewController:Second animated:YES completion:NULL];

} else {
    DemoTapeTwoViewController *Second = [[DemoTapeTwoViewController alloc] initWithNibName:@"DemoTapeTwoViewController_iPad" bundle:nil];
    [self presentViewController:Second animated:YES completion:NULL];


 }

私は2つのxibを持っています。

iPhone 5 1 : XViewController_568.xib

iPhone 4 1 : XViewController.xib

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
if ([[ UIScreen mainScreen ] bounds ].size.height == 568 ) {
    nibName = [NSString stringWithFormat:@"%@_568", nibName];
}
if (self = [super initWithNibName:nibName bundle:nibBundle]) {

}
return self;
}

この ^ は .m ファイルに入ります

画面が iPhone 5 または iPhone 4 の画面であるかどうかを検出し、それに合わせて Xib を調整する必要があります。

ただし、Xcode のエラーは次のとおりです。

キャッチされていない例外 'NSInternalInconsistencyException' が原因でアプリを終了しています。 「(null)_568」という名前のドライブ Gestures.app (loaded)'' 最初のスロー コール スタック:

そのため、何かがうまくいかず、iPhone 4 Xib の元の名前が見つかりません。

誰でも私を助けることができますか?

4

1 に答える 1

3

nibName が nil かどうかを確認し、そうであればクラス名を使用することをお勧めします。

私は?:、この種の迅速な置換に を使用するのが好きです。

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if ([[ UIScreen mainScreen ] bounds ].size.height == 568 ) {
        nibName = [NSString stringWithFormat:@"%@_568", nibName ?: @"DemoTapeTwoViewController"];
    }

    if (self = [super initWithNibName:nibName bundle:nibBundle]) {

    }
    return self;
}

より一般的にするには、NSStringFromClass()を使用します。

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle {
    if ([[ UIScreen mainScreen ] bounds ].size.height == 568 ) {
        nibName = [NSString stringWithFormat:@"%@_568", nibName ?: NSStringFromClass([self class])];
    }

    if (self = [super initWithNibName:nibName bundle:nibBundle]) {

    }
    return self;
}
于 2013-06-26T22:03:47.660 に答える