2011-11-11 5 views
0

これと混同されているビットです。iOS4 - UINavigationスタックにアクセスするカスタムビュー

私はうまく動作しているナビゲーションベースのプロジェクトを持っています。私は複数の場所で使用するいくつかのボタンを作るために私の最初のカスタムUIViewを作成しようとしています。ボタンの1つは、クリックしたときにViewControllerをナビゲーションにプッシュする必要がありますが、これを行う方法がわかりません。

LocationViewController *controller = [[LocationViewController alloc] initWithNibName:@"LocationViewController" bundle:nil]; 
     [self.navigationController pushViewController:controller animated:YES]; 
     [controller release]; 

が、self.navigationコントローラは、現在動作しませんが、ます、それは:私は私が使用していたビューコントローラ内の設定ボタンを持っていた

?どのように私は、このuiviewが追加されるviewcontrollerのナビゲーションコントローラにアクセスするのですか?

私が言ったように、少なくとも私が言ったように、少なくともいくつかは、uiviewをサブクラス化して複数のページに追加するので、少し失われてしまいます。

EDIT TO ADD - 私はカスタムUIView内のボタンクリックイベントを持っているので、viewcontrollerを変更しようとしています。代わりにビューを追加するViewControllerでイベントを配線する必要がありますか?

+0

あなたのアプリケーションにはナビゲーションコントローラが1つだけまたは複数ありますか? – iOSPawan

+0

アプリには、デリゲートの開始時に1つのナビゲーションコントローラしか設定されていません – Dave

答えて

0

通常、appDelegateにはUINavigationControllerプロパティがあります。

UINavigationController *navController = (MyAppDelegate *)[[[UIApplication sharedApplication] 
     delegate] navigationController]; 

しかし、より効果的な方法は、カスタムビューのデリゲートメソッドを作成し、あなたのViewControllerにボタンアクションを処理することです:あなたはこのようなあなたのカスタムビューにアクセスすることができます。

MyCustomView.h 

    @protocol MyCustomViewDelegate 
    @interface MyCustomView : UIView { 
     id<MyCustomViewDelegate> cvDelegate; } 
    @property(nonatomic, assign) id<MyCustomViewDelegate> cvDelegate; 

    @protocol MyCustomViewDelegate @optional 
    -(void)didClickInCustomView:(MyCustomViewDelegate*)view withData:(NSObject*)data; 
    @end 

MyCustomView.m

- (void)myButtonClick:(id)sender 
    { 
     [self.cvDelegate didClickInCustomView:self withData:someData]; 
    } 

だから今、あなたのカスタム ビューがある任意の場所でこのイベントを処理することができます。

+0

これは私が必要なもののように見える、ありがとう、私はそれを行ってあげるよ。 – Dave

+0

マイナーなコード変更を加えても、(MyAppDelegate *)の前に余分な角括弧が必要で、最後を閉じる必要があるようです。 – Dave

0

は、コードを使用して、インターフェイスビルダーからか、View ControllerののviewDidLoadからボタンを追加します。

CGRect frame = CGRectMake(0, 0, 24, 24); 
UIButton *button = [[UIButton alloc] initWithFrame:frame]; 
[button addTarget:self action:@selector(handleMyButton:) forControlEvents:UIControlEventTouchUpInside]; 
[self.view addSubview:button]; 

を次に、あなたのビューコントローラで-(void)handleMyButton:(id)sender {};を実装します。代わりに-(IBAction)handleMyButton:(id)sender {};とインタフェースビルダーを使用してメソッドとボタンをリンクすることもできます。

次に、上記の方法でコードを貼り付けてください。 Xcodeナビゲーションコントローラのテンプレートプロジェクトで作業を開始した場合は、それが動作するはずです。

私はそれがhide the designated initializer initWithNibNameよりも綺麗だと思います。実装の詳細です。

あなたがUIViewのサブクラス化をしていると、私はあなたが意味することを正確にはわかりません。 UIViewControllerテンプレートを使用してXIBファイルをカスタマイズするだけで、UIViewをサブクラス化する必要はありません。ビューはビューであり、ハンドリングボタンのようなコントローラのものはコントローラ内になければなりません。

+0

ボタンの行はほぼすべてのviewcontrollerに入る必要があるため、同じコードを繰り返す必要はありません。再利用可能なビューを私はちょうどドロップすることができ、すべてのセクションで仕事があります。 – Dave

+0

ああ、それで意味があります。 – Jano

0

コントローラを別のコントローラにプッシュできるようにするには、実際のコントローラをナビゲーションコントローラスタックに配置する必要があります。

新しいナビゲーションコントローラインスタンスを作成し、LocationViewControllerを押すことができます。