Я ищу простой способ удалить сразу все подпредставления из суперпредставления вместо того, чтобы удалять их по одному.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
Чего мне не хватает?
ОБНОВИТЬ
Мое приложение имеет основной container_view
. Я должен добавить другие виды в качестве подпредставлений container_view
, чтобы обеспечить своего рода навигацию.
Поэтому, когда я нажимаю кнопку, чтобы «открыть» определенную страницу, мне нужно удалить все подвиды и добавить новую.
ОБНОВЛЕНИЕ 2 - рабочее решение (OS X)
Я думаю, Apple исправила это.
Теперь это проще, чем когда-либо, просто позвоните:
for view in containerView.subviews{
view.removeFromSuperview()
}
Ответы:
РЕДАКТИРОВАТЬ: (спасибо Иеремия / Ролло)
Безусловно, лучший способ сделать это в Swift для iOS - это:
^^ Эти функции забавны!
//// КОНЕЦ РЕДАКТИРОВАНИЯ
Просто сделай это:
Или если вы ищете определенный класс
источник
result of call to 'map' is unused
не является ошибкой.Array.map
в большинстве языков вернет измененный массив. Эквивалентный метод, который не возвращает массив, был быview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
Для iOS / Swift, чтобы избавиться от всех подпредставлений, которые я использую:
чтобы избавиться от всех подпредставлений определенного класса (например, UILabel), я использую:
источник
Код может быть написан проще следующим образом.
источник
Это должно быть самое простое решение.
(см. Удалить все подпредставления? для других методов)
Обратите внимание, что это вопрос MacOS, и этот ответ работает только для MacOS . Это не работает на iOS.
источник
NSView
(OS X) иUIView
(iOS).NSView
не для iOS иUIView
. Только люди не хотят читать вопрос и теги, поэтому он заполнился ответами iOS.Я не знаю, удалось ли вам решить эту проблему, но недавно я столкнулся с подобной проблемой, когда цикл For оставлял один просмотр каждый раз. Я обнаружил, что это произошло потому, что self.subviews был видоизменен (возможно) при вызове removeFromSuperview ().
Чтобы это исправить я сделал:
Выполнив .copy (), я мог выполнить удаление каждого подпредставления, изменяя массив self.subviews. Это потому, что скопированный массив (subViews) содержит все ссылки на объекты и не является мутированным.
РЕДАКТИРОВАТЬ: В вашем случае я думаю, что вы бы использовать:
источник
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Попробуй это:
источник
Расширение для удаления всех подпредставлений, оно быстро удаляется.
источник
Попробуй это:
ОБНОВЛЕНИЕ : Если вы чувствуете себя предприимчивым, вы можете сделать расширение в UIView, как показано ниже:
И назовите это так:
источник
В xcodebeta6 это сработало.
источник
Я написал это расширение:
Так что вы можете использовать self.view.lf_removeAllSubviews в UIViewController. Я опубликую это в быстрой версии моей https://github.com/superarts/LFramework позже, когда у меня будет больше опыта в быстрой работе (пока 1 день опыта, и да, для API я отказался от подчеркивания).
источник
Swift 3
Если вы добавите тег к своему виду, вы можете удалить определенный вид.
источник
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Swift 5
Я создаю 2 разных метода для удаления подпредставления. И это гораздо проще использовать, если мы поместим их в
extension
источник
Ваш синтаксис немного выключен. Убедитесь, что вы разыгрываете явно.
источник
ты должен попробовать это
источник
Для удаления только подпредставлений определенного класса - это был единственный код Swift, который работал для меня в Xcode6.1.1. Предполагая, что единственные подпредставления, которые вы хотите удалить, имеют тип UIButton ...
источник
Один лайнер:
Я думаю, что этот подход более читабелен, чем «однострочники», использующие map или forEach . Сокращенный foreach и map могут быть трудны для понимания, так как логика более абстрактна.
источник
Для Swift 3
Я сделал следующее, потому что просто удаление из суперпредставления не стирало кнопки из массива.
источник
Попробуйте, я проверил это:
источник
Для
Swift 4.+
Я надеюсь, что это полно для вас.
источник
ты пробовал что-то вроде
источник