web-dev-qa-db-ja.com

UIStackView:サブビューを削除するには、removeFromSuperViewとremoveArrangedSubviewの両方を呼び出す必要が本当にありますか?

IStackView Class Reference から

RemoveArrangedSubviewで:

スタックのremoveArrangedSubview:メソッドを呼び出した後にビューが画面に表示されないようにするには、ビューのremoveFromSuperviewメソッドを呼び出して、サブビュー配列からビューを明示的に削除します。

ArrangedSubviewで:

配置されたビューのremoveFromSuperviewメソッドが呼び出されるたびに、スタックビューは、arrangedSubview配列からビューを削除します

これらから、removeFromSuperviewを呼び出すだけでサブビューを削除するのに十分であるようで、問題なくそのように使用しています。また、removeFromSuperviewが呼び出されたときに、arrangedSubviews配列のカウントを記録することで、動作を確認しました。

ただし、S/Oに関する多くのチュートリアルとコメントは、両方を呼び出すように言っています。これには理由がありますか?それとも、ドキュメントがそう言っているので、人々はそれをしますか?

50
robola

いいえ、subview.removeFromSuperView()を呼び出すだけです

/* Removes a subview from the list of arranged subviews without removing it as
 a subview of the receiver.
    To remove the view as a subview, send it -removeFromSuperview as usual;
 the relevant UIStackView will remove it from its arrangedSubviews list
 automatically.
 */
open func removeArrangedSubview(_ view: UIView)
59
zurakach

IOS 12.0では、使用する必要があります

_stackView.arrangedSubviews[index].removeFromSuperview()
_

removeArrangedSubviewを使用すると、指定されたインデックスのビューが削除されるバグがありますが、CGPoint(x: 0, y: 0)にクリアしたいビューが表示されます。

これが誰かを助けることを願っています。

20
Changnam Hong

Swiftでのハッキングは、この場合はWebビューを使用して、かなり良い例と説明を提供します。

その理由は、スタックビューの配置されたサブビューリストから何かを削除して、後で再追加することができ、そのたびに再作成する必要がないためです。メモリリークは望ましくないため、削除されたWebビューを完全に削除します。メモリ使用量のバルーニングが見つかった場合は、おそらくこの手順を忘れてしまったでしょう!

https://www.hackingwithswift.com/read/31/4/removing-views-from-a-uistackview-with-removearrangedsubview

9
inreflection7

そのとおりです。ビューを完全に削除するには、removeFromSuperviewを呼び出すだけで十分です。

両方を置く人がいる理由は、両方が必要であると思われるremoveArrangedSubviewのドキュメントにまたがっているからだと思う。 (実際、removeArrangedSubviewを呼び出してビューを本当に表示したい場合は、そうです。)

arrangedSubviewsの追加のドキュメントはあまり多く見られないので、removeArrangedSubviewがこの場合はオプションであることに気付きません。

6
Graham Perks

スタックビューからarrangedSubviewを削除するには

// Remove it from the stack view
    stackView.removeArrangedSubview(subView)

// now remove it from the view hierarchy – this is important!
   subView.removeFromSuperview()
5
Ajumal