Подтвердить что ты не робот

UIStackView: действительно ли необходимо вызвать removeFromSuperView и removeArrangedSubview для удаления подвью?

Из Ссылка на класс UIStackView

В removeArrangedSubview:

Чтобы предотвратить появление представления на экране после вызова стека removeArrangedSubview: метод, явно удалить представление из массива subviews, вызвав метод removeFromSuperview.

В locationSubview:

Всякий раз, когда вызывается упорядоченный вид removeFromSuperview, представление стека удаляет вид из его организованного массива Subview

С их помощью кажется, что вызывать просто removeFromSuperview достаточно, чтобы удалить подзаголовок, и я использовал его без проблем. Я также подтвердил поведение, зарегистрировав подсчет массива организованныхSubviews при вызове removeFromSuperview.

Однако многие учебники и комментарии на S/O говорят, что они оба. Для этого есть причина? Или люди просто делают это, потому что документация говорит так?

4b9b3361

Ответ 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()