2

別のViewController()から呼び出されるSecondViewControllerという名前のメソッドを持つView Controller( )があります。このメソッドは、初期化後に呼び出されます。setupHomeScreenFirstViewController SecondViewController

内に、メインビューと同じ境界を設定したいsetupHomeScreenaが作成されます。これは、iPadが縦向きモードと横向きモードのどちらで表示されるかによって異なります。UIView

メソッドが最初に呼び出されたとき(アプリの起動時)、ビューは完全に間違っており、NSLog出力はにself.view.frame.size.width等しいことを示してい0.0000ます。

に移動してからThirdViewControllerに戻るとSecondViewController、ビューが正しく表示され、self.view.frame.size.width値は768です。

didRotateFromInterfaceOrientationメソッドの内容をメソッドとメソッドの中に入れるなど、これを解決するためにさまざまなことを試みましたがviewDidAppear:、何も機能しないようです。

どんな助けでも大歓迎です。

4

1 に答える 1

4

メソッドが最初に呼び出されたとき(アプリの起動時)、ビューは完全に間違っており、NSLog出力はself.view.frame.size.widthが0.0000に等しいことを示しています。

これは、ビューがまだロードされていないことが原因である可能性があります。ビューコントローラは、実際に必要になるまでビューをロードしません。これは通常、ビューが初めて表示されるときです。ビューが表示される前にコードがビューの幅を見つけようとしている場合は、ビューがロードされていない可能性があります。Objective-Cでは、にメッセージを送信することが許可されnilており、予想されるタイプに応じて、結果は0またはnilになります。

ThirdViewControllerに移動してからSecondViewControllerに戻ると、ビューが正しく表示され、self.view.frame.size.widthの値は768になります。

これは上記の説明と一致しています。ビュー階層を表示するSecondViewControllerと、それらのビューがロードされ、ビューの幅を見つけるのに問題はありません。

ビューコントローラのviewプロパティにアクセスするだけで、ビュー階層がロードされます。必要な場合は、をself.view呼び出す前ににアクセスして問題を修正できますsetupHomeScreen。ただし、はるかに優れた解決策は、の-viewDidLoad方法でビューの幅を設定することですSecondViewController。これにより、ビューコントローラの「遅延読み込み」動作が維持され(メモリが節約され)、必要なときにビューの幅が設定されるようになります。

于 2012-09-24T04:46:52.287 に答える