2009-03-12 15 views
3

私は基本的なiPhoneプログラミングを進めようとしています。Interface Builderの仕組みをよく理解していますので、プログラムでビューを実行することにしました。私はViewControllerアップルのガイドを通過し、どこでも検索し、私の問題の解決策を見つけることができないようです。これは私がそれが非常に単純な解決策であると信じるように導くが、私は本当に壁に頭を打つだけである。基本的に私がしようとしているのは、メインウィンドウをサブビューとして取得するビューを作成することです。 self.viewが定義されていないと、loadViewメソッドが呼び出され、すべてがそこに設定されているはずです。ここに私のコードの現在の状態は次のとおりです。このiPhoneプログラムが-loadViewを呼び出さないのはなぜですか?

デリゲート:

- (void)applicationDidFinishLaunching:(UIApplication *)application {  
    StartMenuViewController *aViewController = [[StartMenuViewController alloc] init]; 
    self.myViewController = aViewController; 
    [aViewController release]; 

    UIView *controllersView = [myViewController view]; 

    window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 
    [window setBackgroundColor:[UIColor redColor]]; 

    [window addSubview:controllersView]; 
    [window makeKeyAndVisible]; 
} 

ビューコントローラ:事前に助けを

- (id)init { 
    if (self = [super init]) { 
     self.title = @"Start Menu"; 
    } 
    return self; 
} 

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    UIView *startView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame]; 
    [startView setAutoresizingMask:UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth]; 
    [startView setBackgroundColor:[UIColor greenColor]]; 
    self.view = startView; 
    [startView release]; 
} 

ありがとう!

答えて

9

あなたはUIViewControllerを継承していて、 - (UIView *)ビューの実装をオーバーライドしていませんか?

EDIT:さらに詳しい情報:

のUIViewControllerは、特殊な実装がある - それは呼ばれていたときにビューメンバ変数が設定されていない場合は、loadViewメソッドが呼び出されるように、「(のUIView *)ビュー」のメッセージを。そのため、サブクラス(またはviewという名前のプロパティ)に " - (id)view"の実装を提供すると、 " - loadView"の自動呼び出しが中断されます。

+0

これは、ビューコントローラ の#import @interface StartMenuViewControllerためのヘッダである:のUIViewController { \tのUIView *図です。 } @property(非構造、保持)UIView *ビュー; @end – Alex

+0

@synthesizeビューを使用していますか?もしあなたがそうであれば、それは問題です。 view @property –

+0

を宣言または実装する必要はありません(ビューのメンバーは持っていないはずですが、それは関連しているとは限りません)。 –

0

少なくとも、最初のウィンドウ/ビューではインタフェースビルダーを使用することを強くお勧めします。

XCodeで新しいプロジェクトを作成する場合は、設定済みの多くの事前定義されたiPhoneテンプレートから1つを選択する必要があります。

+0

私が書いたいくつかの初期プログラムでは、実際にInterface Builderを試しました。このコードは、実際にナビゲーションコントローラを作成しようとしたときに発生し、ビューを追加しても表示されませんでした。だから私はちょうどメインウィンドウ(上のコード)には、ダイスを追加することができたかどうかを確認しようとしました – Alex

+0

ウィンドウ、ビュー、およびビューコントローラをプログラムで作成するには何も問題はありません。それを自分で行うと、フレームワークの仕組みを理解するのに役立ちます。さらに、Xcodeテンプレートアプリでコードが複雑になっていることがわかりました。 –

+0

私は何も間違っていることに同意しますが、テンプレートを使用してSDKを初めて使う方にとっては、より良い方法です。 –

0

私はこの間違ったを読んでいない限り、あなたはこの

myViewController.view = controllersView; 

のようなコントローラのビュープロパティを持つ任意のビューを関連付けるていなかったので、限りココアが懸念しているあなたは、ウィンドウに設定されているビューには、コントローラを持っていませんloadViewを呼び出すloadViewは、ビューのメソッドではなくViewのコントローラです。ウィンドウに割り当てるビューは、どのView Controllerにも関連付けられていません。したがって、ビューコントローラのloadViewメソッドは呼び出されません。それを得る?表示しようとしているビューに関連付けられているビューコントローラはありません。

あなたはフレームワークが自動的に

IBのコントローラのビュープロパティにあなたはIBで作成したのUIViewオブジェクトをリンクすることができますビューを作成するためのインタフェースビルダを使用しますが、IBに行われていない場合は、あなたがそれを設定する必要が念のため「loadViewメソッドが呼び出されていない」文書化する

1

私は、マスターのViewControllerのための詳細データを処理するために2のUITableViewController(複数可)を書きました。悪魔は#2にあったので、私は#1のためのシンプルなUITableViewControllerを作って、 "マスター" ViewControllerのXIBでそれを参照しました。

私が#2で終わったとき、#1にコードをコピーして、複雑なコードを削除し、人生を続けることができました。

私の苦労と数日間の仕事で、私が何をしても、viewLoadは私の単純な#1 UITableViewControllerのために呼び出されていませんでした。

今日、私は最終的に、マスターViewControllerプログラムへのXIBのUITableViewControllerを参照していることに気付きました。もちろん、loadViewは呼び出されませんでした。

ちょうど同じ間違いを作るいくつかの他のdorkを助けるために....

よろしく、 チャールズ

1

のviewDidLoadビューはペン先からアーカイブされていない場合にのみ、ビューが設定された後、メソッドが呼び出されます。

loadViewは、ビューprobertyがnilの場合にのみ呼び出されます。プログラムでビューを作成するときに使用します。デフォルト:サブビューのないUIViewオブジェクトを作成します。

  • (ボイド)loadViewメソッド{ のUIView *ビュー= [[UIViewのアロケーション] initWithFrame:[UIScreen mainScreen] .applicationFrame]。 [ビューsetBackgroundColor:_color]; self.view = view; [リリースを見る]; }

    loadViewメソッドを実装することで、デフォルトのメモリ管理動作にフックできます。メモリが低い場合、ビューコントローラはdidReceiveMemoryWarningメッセージを受信することがあります。デフォルトの実装では、ビューが使用中かどうかを確認します。ビューがビュー階層内になく、View ControllerがloadViewメソッドを実装している場合は、そのビューが解放されます。後でビューが必要になると、loadViewメソッドが再度呼び出されて ビューが作成されます。

関連する問題