あなたは用語について少し混乱しているようです。 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を使用して、可視から不可視に移行するかどうかを判断できます。
私はちょうど "各ビューコントローラに画面全体を管理させる"というスタイルを単に問題にするのではなく、 UIViewControllerはそれらが画面を満たしていると想定し、Appleはコンテナビューコントローラでそのルールを回避することができますが、そうしようとするべきではありません。ビューコントローラを入れ子にすると、バグや予期しない動作が発生し、新しい開発者にとってよくある問題です。 – Jonah
こんにちは、あなたの答えをありがとう、私は、宣言プロトコルのためのNotificationDelegate.hという別のファイルを追加しました。ここで私はfunction - (void)Notificationを宣言し、私は delegateを宣言しました。サブビューコントローラで(プロパティと実装クラスで合成)、私はfunctionviewを定義しました - (void)parentviewcontroller implementationaionクラスでの通知ですが、関数 - (vod)呼び出しではない –
Senthil
willRemoveSubviewを使う必要があります。メソッドUIViewはオーバーライドする必要がある自身を呼び出します。また、あなたが定義した新しいサブクラスであるビューをInterface BuilderとXcodeで設定していることを確認しましたか? – Tommy