2011-02-22 5 views
1

私はビューベースのアプリケーションを持っており、サブビューが削除されたときにスーパービュー(parentview)でメソッドを呼びたいと思っています。 1)両方(親、サブ)ビューは、UIViewControllerのサブクラスです 2)[self.view addSubview:subviewController]としてサブビューを追加しました。 3)[self.view removeFromSuperview]によって親からサブビューを削除しました。iPhoneサブビューからparentviewのメソッドを呼び出す方法

いずれかが私を助けてください。

答えて

4

あなたは用語について少し混乱しているようです。 UIViewsとUIViewControllerは別々のものです。ビューコントローラにはビューがあります。ビューは何かが削除されたときを知ることができますが、この場合、ビューコントローラは、ビューから何かが削除されたときを知ることを望みますか?

プログラム内のクラス階層について他の前提を置かずに、ビューコントローラをデリゲートとして保持し、何かを削除するときに通知するカスタムサブクラスUIViewを作成することをお勧めします。そのうちの1つを親ビューとして使用し、それを親ビューコントローラに代理人として与えます。

親ビューコントローラがメッセージを取得すると、削除されるビューと子ビューコントローラに属するビューが比較されます。彼らが一致すれば、あなたはあなたが望むものを手に入れました。

例のUIViewサブクラス、インターフェース:

@protocol UIViewThatNotifiesViewControllerDelegate 
- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview; 
@end 

@interface UIViewThatNotifiesViewController: UIView 
{ 
    UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
} 

@property (nonatomic, assign) UIViewController <UIViewThatNotifiesViewControllerDelegate> *delegate; 
@end 

が実装:

@implementation UIViewThatNotifiesViewController 

@synthesize delegate; 

- (void)willRemoveSubview:(UIView *)subview 
{ 
    [delegate view:self willRemoveSubview:subview]; 
    [super willRemoveSubview:subview]; 
} 

@end 

する(Interface BuilderでとXcodeで)それを変更し、あなたの親ビューコントローラの現在のビューは、型のUIViewであると仮定すると、タイプUIViewThatNotifiesViewControllerのです。ビューコントローラがUIViewThatNotifiesViewControllerプロトコルを実装して、コンパイラの警告を回避することを宣言します。そして、ビューコントローラにこのようなものを追加します。

- (void)view:(UIView *)view willRemoveSubview:(UIView *)subview 
{ 
    if(subview == subviewController.view) 
    { 
     NSLog(@"his view is in the process of being removed"); 
    } 
} 

この種のものを行うには文体より正常な方法は、各ビューコントローラは、情報のフル画面全体を管理することです。したがって、ビューを1つから別のビューに追加しないでください。代わりに、presentModalViewController:を使用して、あるコントローラーから別のコントローラーに制御を渡し、dismissModalViewController:親に関係なく子が棄却できるように[self.parentViewController dismissModalViewController:...]で戻します。ビューコントローラメソッドviewWillAppear、viewDidAppear、viewWillDisappear、およびviewWillAppearを使用して、可視から不可視に移行するかどうかを判断できます。

+1

私はちょうど "各ビューコントローラに画面全体を管理させる"というスタイルを単に問題にするのではなく、 UIViewControllerはそれらが画面を満たしていると想定し、Appleはコンテナビューコントローラでそのルールを回避することができますが、そうしようとするべきではありません。ビューコントローラを入れ子にすると、バグや予期しない動作が発生し、新しい開発者にとってよくある問題です。 – Jonah

+0

こんにちは、あなたの答えをありがとう、私は、宣言プロトコルのためのNotificationDelegate.hという別のファイルを追加しました。ここで私はfunction - (void)Notificationを宣言し、私は delegateを宣言しました。サブビューコントローラで(プロパティと実装クラスで合成)、私はfunctionviewを定義しました - (void)parentviewcontroller implementationaionクラスでの通知ですが、関数 - (vod)呼び出しではない – Senthil

+0

willRemoveSubviewを使う必要があります。メソッドUIViewはオーバーライドする必要がある自身を呼び出します。また、あなたが定義した新しいサブクラスであるビューをInterface BuilderとXcodeで設定していることを確認しましたか? – Tommy

関連する問題