33

ココアに慣れていないので、私はInterface BuilderUIViewControllerそして友達といくつかの問題を抱えています。

xibで定義されたUIViewControllerサブクラスがありUIView、コントローラーのビューアウトレットがビューに接続されています。xibの「ファイルの所有者」はmyViewcontrollerサブクラスとして設定されます。

この1つの例では、(メインビューコントローラーから)コントローラー/ビューをロードする次のコードが期待どおりに機能しません。

if ( self.myViewController == nil )
{
    self.myViewController = [[MyViewController alloc]
        initWithNibName:@"MyViewController" bundle:nil];
}

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

MyViewControllerのメソッドに、ブレークポイントとログメッセージを配置して、何が起こっているかを確認しました。

-(id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {

    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        NSLog(@"initWithNibName\n");
    }

    return self;
}

-(void)viewDidLoad {

    [super viewDidLoad];
    NSLog(@"viewDidLoad\n");
}

期待される結果

-initWithNibNameとメソッドの両方-viewDidLoadが呼び出され、myViewControllerのビューが表示されます。

観測結果

呼び出されるだけ-initWithNibNameで、ビューは表示されません。

私は何かを逃したことがありますか?誰かがチェックするものをお勧めできますか?(特に、驚くほど不透明なInterface Builderツールで)。

4

11 に答える 11

36

RE: 解決策が見つかりました!!!!!

確かにそれは実用的な解決策のようですが、実際のトリックはview.hiddenプロパティを NO に設定することではありません.nib ファイルからビューをロードするのは、UIViewController'sview メソッドの呼び出しです.ビューは実際に nib からロードされるのは、 view メソッドが初めて呼び出されます。

その意味で、単純な[viewController view]メッセージは、ビューを nib ファイルからロードすることを強制します。

于 2010-08-29T23:22:53.033 に答える
15

わかりました、私は部分的な答えを持っています-多分教祖はもう少し説明することができます。問題は:

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

もっと詳しく見てみると、この場合self.navigationControllerはnilです。したがって、プッシュメッセージはどこにも行きません。

代わりに、私が送信した場合:

[self.view addSubview:self.myViewController.view];

次に、ビューが表示され、-viewDidLoad呼び出されます。

このインスタンスでが設定されていない理由は完全にはわかりませんself.navigationController。私が考えることができるのは、 (コードがどこから来たのか)ではなくselfのサブクラスであるということだけです。UIViewControllerUITableViewControllerpushViewController

また、これらの回答はそうではないと言っていますが、メッセージを黙ってnilにするのは悪い考えのよう です。こちらの私の質問も参照してください。

最終編集:

以下のコメントの回答で、私が実際に求めていた表示関数(myViewControllerがモーダルである場合)は次のとおりであることに気付きました。

[self presentModalViewController:myViewController animated:YES];

有益な回答をありがとうございました。

于 2009-05-27T05:40:45.983 に答える
10

解決策が見つかりました!!!!!

これほど無害なものでも、viewDidLoadメソッド呼び出しが発生します。

これを alloc の直後に挿入しますinitWithNibName

viewController.view.hidden = NO; //calls viewDidLoad
于 2010-01-15T03:55:51.897 に答える
5

作成したカスタムViewControllermain.storyboardからの想定をリンクしていない可能性があります。セグエを介して他のView Controllerからそのコントローラーに移動できる場合がありますが、などは実行されません。Identity InspectorclassviewDidLoad()viewWillAppear()

于 2016-05-11T06:08:13.740 に答える
4

振り返ってみると明らかなもう 1 つの理由:viewController.viewコードで設定されている場合、viewDidLoad イベントはトリガーされません。

于 2015-10-18T08:56:46.747 に答える
4

単に使用する

- (void)viewDidAppear:(BOOL)animated{ 
        [super viewDidAppear:animated];
        //Your Code here
  }

viewDidLoad メソッドの代わりに。

于 2012-03-04T10:48:16.040 に答える
2

実行ログでエラーを確認してください。ほとんどの場合、NIB はロードされていません。そのため、エラーが発生するはずです。その最も可能性の高い原因は、それをバンドルに入れていないことです。「リソースのコピー」ビルド フェーズを調べて、XIB が実際にコピーされていることを確認します。シミュレーター用にビルドし、ビルド ディレクトリに移動して、NIB が .app バンドルにあることを確認します。

于 2009-05-27T02:47:29.713 に答える