3

アプリに奇妙な問題があります。「LoginViewController」という名前の NIB を使用して、実行時に VC をロードします。UIViewその NIB には、次のように NIB に配置されているオブジェクトへのアウトレットがたくさんあります。

ここに画像の説明を入力

実行時に、これらの UIView オブジェクトをヘッダーとしてテーブル ビューに動的に配置します。UIViewこの場合の各セパレート(UITableView右側にあるものを除く) は、このように IBOutlet として設定されます。もちろん、それぞれに異なる名前があります。

@property (strong, nonatomic) IBOutlet UIView *connectionInProgressView;

ここで、VC のviewDidLoad方法で、これら 4 つの個別のビューすべてを実行し、ログに書き込むことでそれらが存在することを確認します。

NSLog(@"connection in progress view: %@", self.connectionInProgressView);

私の問題はこれです: self.connectionInProgressViewiPadではnilであり、iPhoneではnilではありません。プラットフォームに関係なく、他のすべてのビューは nil ではなく、インスタンス化されます。iOS 5.0、5.1、および 6.1 のシミュレーターでこれを実行しています。すべての iPad シミュレーターで問題を再現できます。私のアプリは問題なく動作し、iPhone ではスピナーを使用してビューをロードしますが、iPad ではビューが nil であるためロードできません! どうして!?

私は次のことを試しました:

  • NIB のファイルの所有者が適切なビューを指していることを確認する
  • self.connectionInProgressViewが他の IBOutlet を指していないこと
  • 他のすべてのサブビューが問題のあるビューと同じ方法で接続されていることを確認します。彼らです。
  • すべての NIB 接続を削除した後、削除self.connectionInProgressViewして再作成します。
  • UILabelビューからアクティビティ インジケーターを削除し、内部を含むビューのみを読み込みます。運が悪い、それは活動指標ではありません。
  • を参照している可能性のある VC 内のコードを確認しましたself.connectionInProgressView。何もありません( の nil ステートメント以外viewDidUnLoad)。
  • UINavigationControllerとの AppDelegate プロパティのプロパティ属性タイプを確認していますLoginViewController
  • のコピーをLoginViewControllerAppDelegate に保持しますが、これは無駄に思え、結果に違いはありませんでした。

[編集2]

質問: VC はどのようにロードされますか

AppDelegateUINavigationControllerのプロパティである があります。これは、VC をルート ビュー コントローラーとして渡すUINavigationControlleralloc-init'dです。applicationDidFinishLaunchingWithOptionsこの時点で VC をインスタンス化します。

// Create login/start up views
LoginViewController *loginViewController = [[LoginViewController alloc] initWithNibName:@"LoginViewController" bundle:nil];

self.loginViewNavigationController = [[UINavigationController alloc] initWithRootViewController:loginViewController];

if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad)
    self.loginViewNavigationController.modalPresentationStyle = UIModalPresentationFormSheet;

これはUINavigationController後で iPad のモーダル フォーム シートとして提示しますが (それが私の問題に寄与しているかどうかはわかりません)、iPhone で動作していることに注意してください。

しばらくして AppDelegate で別のデリゲート クラスがイベントをスローしたときに、この UINavigationController を表示し、私の VC をモーダルにします。私はこのようにします:

if (self.loginViewNavigationController != nil) {

    [self.window.rootViewController presentViewController:self.loginViewNavigationController animated:YES completion:nil];
}

この 1 つの特定のビューが NIB にドラッグされ、他のすべてのビューが iPad では nil であり、iPhone では nil ではないのと同じように配線されている理由を突き止めようとしています。

[編集1]重複した質問を検索しているときに、これを見つけることができませんでした:

nil を指しているいくつかの IBOutlets

私は一人じゃない!

何か案は?

4

3 に答える 3

5

LoginViewController.xibユニバーサル アプリを構築しているので、iPhoneとiPad 用に (LoginViewController~ipad.xib通常は)別の NIB を作成していませんか?

または、XIB は 1 つしかないと思っていたのに、ある時点で NIB にコンパイルされた iPad 専用の XIB があり、プロジェクトで XIB ファイルを削除しても、コンパイルされた iPad 専用の NIB はビルド製品に残っている場合があります。 .

いずれにせよ、次のことを試してください。

  • プロジェクトをクリーンアップするか、さらに良いことに、ビルド製品ディレクトリをクリーンアップします
  • 後者を行うには、派生データ フォルダーを削除できます (「オーガナイザー」ウィンドウ -> 「プロジェクト」タブ -> 左側でプロジェクトを選択 -> 「派生データ」の横にある「削除」ボタンをクリックします)。
  • 念のため、すべてのシミュレーターからアプリを削除してください
  • ビルドして再度実行

これがうまくいかない場合、問題が別の XIB を使用している iPad に関連しているかどうかをデバッグして特定するのに役立ついくつかのアイデア:

  • 別の XIB を変更するなど、いくつかのテストを試すことができIBOutletます。たとえば、XIB で接続されていたビューからのものIBOutletではない他の XIB の 1 つを切断nilして、アプリを再度実行すると、nil今回はログに記録されるようにします。それがniliPhone シミュレーター上にある場合 (切断したばかりなので予想どおり)... それでもniliPad シミュレーター上にない場合は、iPhone と iPad で異なる XIB ファイルを使用していることを意味します。
  • XIB で、あなたの の のUIView1 つに正しく接続されているの色を変更しIBOutlet、変更が iPhone と iPad の両方に反映されているか、iPhone のみに反映されているかを確認することもできます。編集しているこの XIB が同じであることを確認してください。 iPadで使用されているかどうか。
于 2013-02-20T22:43:42.610 に答える