3

事前に申し訳ありませんが、同様の質問がすでにたくさんあることを知っています. 私はすべての解決策を試しましたが、どれもうまくいきませんでした。

私はXcode 4.5.2を使用しており、iphone5/ios6 1> RootViewController5および他のすべてのデバイスに2つのxibを使用しています2> RootViewController これらの両方のnibファイルには、RootViewControllerという名前の単一のViewControllerがあります.両方のnibファイルのファイル所有者で、RootViewControllerクラスを選択ましたカスタム クラス インスペクター。

ViewDidLoad メソッドで、このように 2 つのペン先をロードしようとしています

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        UIViewController *viewController3;
        if(result.height == 480)
        {
          viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease];
        }
        if(result.height == 568)
        {
        viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5" bundle:nil] autorelease];

            NSLog(@"iphone 5 123");
        }
    }

以下のコードも試しました

 if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        RootViewController *viewController3;
        if(result.height == 480)
        {
          viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController" bundle:nil] autorelease];
        }
        if(result.height == 568)
        {
        viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5" bundle:nil] autorelease];

            NSLog(@"iphone 5 123");
        }
    }

しかし、運がありません。どこが間違っているのか教えてください。

ありがとう

マユール

4

5 に答える 5

4

代わりに次のようにすることをお勧めします。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){
        if([UIScreen mainScreen].bounds.size.height == 568.0)
        {
            //Use iPhone5 VC
            self = [super initWithNibName:@"RootViewController-568h" bundle:nibBundleOrNil];
        }
        else{
            //Use Default VC
            self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        }
    }
    return self;
}

それは、あなたの RootViewController がまさにその名前である場合です。このようにすることで、別のサイズの iPhone/iPod を追加することを決定した場合に、将来のクラッシュから身を守ることができます。2 つの if ステートメントを使用しているため、どちらも true でない場合、アプリがクラッシュし、適切なコーディングではありません。

別の画面サイズをリリースする必要がある場合、見栄えはよくありませんが、少なくともクラッシュすることはありません。

于 2013-04-13T17:55:24.777 に答える
0

iPhone5とiPhone4、4Sなどに2つの異なる.xibを使用する必要はないと思います。画像、ラベル、ボタンなどのサイズを変更したい場合は、SpringとStructsが使用されます。質問に書いたコードを使用して、プログラムでサイズを設定することもできます (.m ファイルに.......)

私も以前にその過ちを犯したことがあります。プログラムを実行していたとき、いつもエラーが発生しました

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
 reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "View" nib but
 the view outlet was not set.' *** First throw call stack:(0x1c93012 0x10d0e7e 0x1c92deb 
0xf58c8 0xf5dc8 0xf5ff8 0xf6232 0x453d5 0x4576f 0x45905 0x4e917 0x2b7f 0x12157 0x12747 
0x1394b 0x24cb5 0x25beb 0x17698 0x1beedf9 0x1beead0 0x1c08bf5 0x1c08962 0x1c39bb6 
0x1c38f44 0x1c38e1b 0x1317a 0x14ffc 0x25fd 0x2525 0x1)libc++abi.dylib: 
terminate called throwing an exception

これは「ペン先の差込口がセットされていなかった」ためです。

したがって、Spring と構造体を使用するか、プログラムで行う必要があると思います..

于 2013-04-13T09:54:00.003 に答える
0

次のことをお勧めします。

VC をインスタンス化するときに、XIB ファイルの代わりにストーリー ボードを使用します。例:

    myVC* vc = [self.storyboard instantiateViewControllerWithIdentifier:@"myVCStoryBoardID"];

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

これにより、VC デザインを同じ屋根の下に保ち、ストーリーボードの強力な機能を使用することができます。

次に、ストーリー ボード コントローラーで自動レイアウトがアクティブであることを確認し、ラベルなどの 1 つの制約が他の要素の境界 (非常に重要) に上下にマップされていることを確認します。これは、移動すると青い点線で具体化されます。ほとんどの場合、ランタイムは画面の高さに関係なく、すべてを整列させることができます。

I understand that there might be some nasty edge cases in this regards, so you might have to adjust stuff manually. Unless you have complex graphics, it's always possible to work with Y coordinate in the [0,1] interval, and once you have to set a frame, use [[UIScreen mainScreen] bounds].size to get the appropriate value, rounded to the nearest integer.

If all the above fails, then you might have to create separate VC, but in my view, that's not really what the SDK is intended for.

good luck!

于 2013-04-13T13:37:49.590 に答える
0

うわー、私はばかだった、私はペン先を正しくロードしていなかったことに気付かなかった. 私が間違っていたのはこのコード行だけです

viewController3 = [[[UIViewController alloc] initWithNibName:@"RootViewController5"bundle:nil] autorelease];と書き ました。それ以外の

 [[NSBundle mainBundle] loadNibNamed:@"RootViewController5" owner:self options:nil];

したがって、私の最終的なコードは次のようになり、完全に正常に動作します

if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        CGSize result = [[UIScreen mainScreen] bounds].size;
        if(result.height == 480)
        {
            // iPhone Classic
            [[NSBundle mainBundle] loadNibNamed:@"RootViewController" owner:self options:nil];
        }
        if(result.height == 568)
        {
            // iPhone 5
            [[NSBundle mainBundle] loadNibNamed:@"RootViewController5" owner:self options:nil];
        }
    }

このリンクのおかげで 正しい回答へのリンク

于 2013-04-15T11:28:12.807 に答える