UIStackView: действительно ли необходимо вызвать removeFromSuperView и removeArrangedSubview для удаления подвью?
Из Ссылка на класс UIStackView
В removeArrangedSubview:
Чтобы предотвратить появление представления на экране после вызова стека removeArrangedSubview: метод, явно удалить представление из массива subviews, вызвав метод removeFromSuperview.
В locationSubview:
Всякий раз, когда вызывается упорядоченный вид removeFromSuperview, представление стека удаляет вид из его организованного массива Subview
С их помощью кажется, что вызывать просто removeFromSuperview достаточно, чтобы удалить подзаголовок, и я использовал его без проблем. Я также подтвердил поведение, зарегистрировав подсчет массива организованныхSubviews при вызове removeFromSuperview.
Однако многие учебники и комментарии на S/O говорят, что они оба. Для этого есть причина? Или люди просто делают это, потому что документация говорит так?
Ответы
Ответ 1
Нет, просто позвоните 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)
Ответ 2
В iOS 12.0 необходимо использовать
stackView.arrangedSubviews[index].removeFromSuperview()
Если вы используете removeArrangedSubview
, существует ошибка, при которой представление по указанному индексу удаляется, но представление, которое я хочу очистить, отображается в CGPoint(x: 0, y: 0)
.
Надеюсь, это поможет кому-то.
Ответ 3
Взлом с помощью Swift предоставляет довольно хороший пример и объяснение, используя в этом случае веб-представления.
Причина в том, что вы можете удалить что-то из упорядоченного списка подпредставлений, а затем повторно добавить его позже, без необходимости заново создавать его каждый раз - оно было скрыто, а не уничтожено. Нам не нужна утечка памяти, поэтому мы хотим полностью удалить удаленные веб-представления. Если вы обнаружите, что использование памяти увеличивается, вы, вероятно, забыли этот шаг!
https://www.hackingwithswift.com/read/31/4/removing-views-from-a-uistackview-with-removearrangedsubview
Ответ 4
Вы правы, просто для вызова removeFromSuperview
достаточно полного удаления.
Я подозреваю, что причина, по которой люди вкладывают оба, заключается в том, что они сталкиваются с документом removeArrangedSubview
, который, как представляется, необходим. (И действительно, они, если вы вызываете removeArrangedSubview
и хотите, чтобы представление действительно исчезло.)
Дополнительный doc в arrangedSubviews
не рассматривается многими, поэтому они не понимают, что removeArrangedSubview
в этом случае необязательно.
Ответ 5
Чтобы удалить организованный Sububview из стека просмотра
// To remove it from the view hierarchy – this is important!
subView.removeFromSuperview()