1

ビューがそのスーパー ビューから削除されたときに発生するイベントは? そのサブビューはメッセージを受け取りますか? たとえば、次のように、subview1 に subview2 と subview3 を追加しています。

super_view -> subview1 -> subview2 -> subview3

たとえば、subview1を削除した場合

[subview1 removeFromSuperview]; 

そのサブビュー (subview2 と subview3) が受け取るイベントは?

スーパービューが削除されたことをサブビューに知らせる方法はありますか?

4

4 に答える 4

5

subview2 と subview3 の保持回数に依存します。[[UIView alloc] initWithFrame:frame] でそれらを作成し、サブビューとして追加すると、保持カウントは 2 になります (または、保持プロパティに参照を保持する場合は 3、つまり self.subview2 = [[...

したがって、subview1 がリリースされたときにそれらをリリースしたい場合は、それらをサブビューとして追加した後に別のリリースを与えるようにしてください。これにより、それらの保持カウントは、サブビューとして追加されてから 1 つだけになります。このようなもの...

UIView* subview2 = [[UIView alloc] initWithFrame:myFrame];
[subview1 addSubview:subview2];
[subview2 release];
于 2009-06-25T05:02:08.810 に答える
1

この質問はまだ開いているので、ここに答えがあります:

@implementation MySubview
- (void)willMoveToSuperview:(UIView *)newSuperview {
  if (!newSuperview) {
    // I'm being removed from my superview.
  }
}
- (void)didMoveToSuperview {
  if (!self.superview) {
    // I no longer have a superview.
  }
}
@end

反対のことが必要な場合は、サブビューが停止していることをスーパービューに通知する方法を次に示します。

@implemenation MySuperview
- (void)willRemoveSubview:(UIView *)subview {
  // I'm about to remove this view.
}
@end

そのサブビュー (subview2 と subview3) が受け取るイベントは?
subview1通知されますが、そのメッセージを渡す必要がありますsubview2(これは自動的には行われません)。subview3subview1

スーパービューが削除されたことをサブビューに知らせる方法はありますか? 単純なデリゲート プロトコルを作成することも、この目的のために
拡張することもできます。UIView

@implementation UIView (superview_notification)
- (void)notifyMyChildrenAboutTheSuperviewChange {
  [[self subviews] makeObjectsPerformSelector:@selector(notifyMyChildrenAboutTheSuperviewChange)];
}
@end

ただし、いつ画面に表示されなくなったかを本当に知りたい場合 (そして、スーパービューがないという事実は目的の二次的なものです)、すべてのサブビューが表示されることに注意してください。UIWindow上記の方法のミラーを通じて通知されます。

@implementation MySubview
- (void)willMoveToWindow:(UIWindow *)newWindow {
  if (!newWindow) {
    // I'm being removed from the screen.
  }
}
- (void)didMoveToWindow {
  if (!self.window) {
    // I'm offscreen.
  }
}
@end
于 2015-08-27T18:34:56.040 に答える
0

ビューがスーパービューから削除されると、その子ビューもすべて削除され、retaincoutが1つ減ります。

次のコードスニペットを見てください。

randomImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"oldbg.png"]];
randomImage.frame = CGRectMake(10, 10, 20, 20);

aview = [[UIView alloc] initWithFrame:CGRectMake(0,0, 320, 200)];

NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

[aview addSubview:randomImage];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);
[randomImage release];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);


[self.view addSubview:aview];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);
[aview release];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

[aview removeFromSuperview];
NSLog(@"aview retain=%d,image retain=%d",[aview retainCount],[randomImage retainCount]);

また、コンソールログは次のようになります。

 2009-08-09 23:29:42.512 ActionSheetTest[744:20b] aview retain=1,image retain=1
2009-08-09 23:29:42.513 ActionSheetTest[744:20b] aview retain=1,image retain=2
2009-08-09 23:29:42.515 ActionSheetTest[744:20b] aview retain=1,image retain=1
2009-08-09 23:29:42.516 ActionSheetTest[744:20b] aview retain=2,image retain=1
2009-08-09 23:29:42.517 ActionSheetTest[744:20b] aview retain=1,image retain=1

実際には、最後のNSLogで、両方のオブジェクトのretainCount = 0であるため、アプリがクラッシュします。

お役に立てれば。

于 2009-08-09T16:33:46.960 に答える
0

subview1 自体が削除されたときに subviews(2,3) がイベントを受け取るとは思わない(少なくともドキュメントには何も言及されていない)。

編集

さらに考えてみると、subview1 が解放されたときに、subviews(2,3) 自体はイベントを受信しないと思います。

ただし、subview1 が他の場所に保持されていない場合、subview1 が解放される副作用として、ref カウントが 0 に達し、割り当てが解除されます。割り当て解除中、subview1 はすべてのサブビューを解放します。

その場合、彼らは解放されますが、これがあなたの求めているものかどうかはわかりません.

ジェーンの答えを見てください。

于 2009-06-24T15:27:09.133 に答える