7

UIViewオブジェクトの単一のインスタンスが他の複数のビューのサブビューとして同時に追加された場合はどうなるのでしょうか。UIView:removeFromSubview:が呼び出された場合、それはすべてのスーパービューから削除されますか、それとも現在表示されているものだけから削除されますか?

背景について:

ビューオブジェクトのようなステータスバーがあり、他のいくつかのビュー内に表示する必要があります(他の各ビューは独自のビューコントローラーによって管理されます)。

[つまり、a)ユーザーが1つのビューにいる、b)ステータスバーのようなビューが表示されるようになっている、c)ユーザーが別のビューに切り替えているd)ステータスバーが新しいビューに表示されているe)ステータスバーはしばらくすると期限切れになり、サイトから消えます。等々]

最初は、ウィンドウのサブビューとして必要に応じて追加/削除することでこれを実装しましたが、これはシングルトンによって管理されていました。ただし、一部のアニメーションには複雑な点があるため、代わりに、各ビューコントローラの各メインビューのサブビューとして追加しました。複数のコピーがないことに注意してください

ビューを削除する必要がある場合、私はそのremoveFromSuperview:を呼び出しており、すべてが完全に機能しています。

しかし、ビューの削除に関する状況はどうなっているのでしょうか。完全に削除されているのでしょうか、それとも他に何かする必要があるのでしょうか。

たとえば、ビューは必要に応じてaddSubviewを呼び出すことでN個のビューコントローラーのビューに追加される場合があります(ビューコントローラーが実際に起動した場合にのみ各ビューコントローラーに追加されます)ただし、ビューが削除されるときは、removeFromSuperview:を呼び出すだけです。現在ロードされているViewControllerであり、追加されている可能性のあるすべてのViewControllerではありません。

次回、これらの他のビューコントローラのいずれかに移動すると、removeFromSuperViewを明示的に呼び出さなくても、ビューが表示されていなくても正常に表示されます。

さっき言ったように、すべてがそのまま機能しているのですが、心の奥底で何か足りないものがあるのではないかと思います。

これが理解できることを願っています。

4

2 に答える 2

15

1つのビューにのみ追加できます。ドキュメントはあなたの友達です!

  • (void)addSubview:(UIView *)view:ビューは1つのスーパービューのみを持つことができます。ビューにすでにスーパービューがあり、そのビューがレシーバーではない場合、このメソッドは、レシーバーを新しいスーパービューにする前に、以前のスーパービューを削除します。
于 2012-08-16T18:59:43.593 に答える
0

私の観点からすると、同じビューを異なる親ビューに(さらに重要なことに、異なるビューコントローラーから)追加する必要があるということは、デザインに問題があることを示しています...

ただし、本当に(本当に)必要な場合は、ビューインスタンスに親ビューを1つだけ持つことができると常に考えていました...さらに、[myView superview]メッセージでアクセスできるため、配列の代わりにUIViewインスタンスが提供されます。 ..新しいスーパービューに追加する前に、古い親から自動的に削除される場合がありますか?

デザインについては、新しいデザインが必要になり、ステータス/ロジックを管理するためのシングルトンが必要になるたびに作成するのはどうですか?

それで頑張ってください!

于 2012-08-16T19:00:04.530 に答える