Как удалить все подвиды вида в Swift?
Я ищу простой метод, чтобы удалить сразу все подвиды из супервизора вместо того, чтобы удалять их по одному.
//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 для того, чтобы обеспечить своего рода навигация.
Итак, при нажатии на кнопку "открыть" определенную страницу, мне нужно удалить allsubviews и добавить новый один.
обновление 2-рабочее решение (OS X)
Я думаю, Apple исправила.
теперь это проще, чем когда-либо, просто позвоните:
for view in containerView.subviews{
view.removeFromSuperview()
}
18 ответов:
EDIT: (спасибо Jeremiah / Rollo)
самый лучший способ сделать это в Swift для iOS:
view.subviews.forEach({ .removeFromSuperview() }) // this gets things done view.subviews.map({ .removeFromSuperview() }) // this returns modified array^^ эти функции весело!
let funTimes = ["Awesome","Crazy","WTF"] extension String { func readIt() { print(self) } } funTimes.forEach({ .readIt() })/ / / / END EDIT
просто сделать это:
for view in self.view.subviews { view.removeFromSuperview() }или если вы ищете определенный класс
for view:CustomViewClass! in self.view.subviews { if view.isKindOfClass(CustomViewClass) { view.doClassThing() } }
для iOS / Swift, чтобы избавиться от всех subviews я использую:
for v in view.subviews{ v.removeFromSuperview() }чтобы избавиться от всех подвидов определенного класса (например, UILabel) я использую:
for v in view.subviews{ if v is UILabel{ v.removeFromSuperview() } }
Это должно быть самое простое решение.
let container_view: NSView = ... container_view.subviews = [](см. удалить все подпанелей? для других методов)
Примечание MacOS вопрос и этот ответ работает только для MacOS. Он не работает на iOS.
Я не знаю, удалось ли вам решить эту проблему, но недавно я столкнулся с аналогичной проблемой, когда цикл For оставил один вид каждый раз. Я обнаружил, что это было потому, что Я.подпанелей был видоизменен (может быть), когда removeFromSuperview() был вызван.
чтобы исправить это я сделал:
let subViews: Array = self.subviews.copy() for (var subview: NSView!) in subViews { subview.removeFromSuperview() }делать .copy (), я мог бы выполнить удаление каждого подвида при мутации себя.массив подвидов. Это связано с тем, что скопированный массив (вложенные представления) содержит все ссылки на объекты так и не мутировали.
EDIT: в вашем случае я думаю, что вы бы использовали:
let theSubviews: Array = container_view.subviews.copy() for (var view: NSView!) in theSubviews { view.removeFromSuperview() }
расширение для удаления всех подвидов, он быстро удаляется.
import Foundation import UIKit extension UIView { /// Remove allSubView in view func removeAllSubViews() { self.subviews.forEach({ .removeFromSuperview() }) } }
попробуйте это:
var subViews = parentView.subviews as Array<UIView> for someView in subViews { someView.removeFromSuperview() }обновление: если вы чувствуете себя предприимчивым, то вы можете сделать расширение на UIView, как показано ниже:
extension UIView { func removeAllSubViews() { for subView :AnyObject in self.subviews { subView.removeFromSuperview() } } }и назовем это так:
parentView.removeAllSubViews()
в xcodebeta6 это сработало.
var subViews = self.parentView.subviews for subview in subViews as [UIView] { subview.removeFromSuperview() }
Я написал это расширение:
extension UIView { func lf_removeAllSubviews() { for view in self.subviews { view.removeFromSuperview() } } }, Так что вы можете использовать самостоятельно.вид.lf_removeAllSubviews в UIViewController. Я положу это в быстрой версии моего https://github.com/superarts/LFramework позже, когда у меня будет больше опыта в swift (1 день exp до сих пор, и да, для API я отказался от подчеркивания).
ваш синтаксис немного выключен. Убедитесь, что вы бросили явно.
let theSubviews : Array<NSView> = container_view.subviews as Array<NSView> for view in theSubviews { view.removeFromSuperview() }
вы должны попробовать это
func clearAllScrollSubView () { let theSubviews = itemsScrollView.subviews for (var view) in theSubviews { if view is UIView { view.removeFromSuperview() } } }
Swift 3
Если вы добавляете тег в свой вид, вы можете удалить определенный вид.
for v in (view?.subviews)! { if v.tag == 321 { v.removeFromSuperview() } }
для удаления только подвидов определенного класса-это был единственный Swift код, который работал для меня в Xcode6.1.1. Предполагая, что только подвиды, которые вы хотите удалить, имеют тип UIButton...
for subView in nameofmysuperview.subviews { if subView.isKindOfClass(UIButton) { subView.removeFromSuperview() } }
One-liner:
while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}Я думаю, что этот подход более читаем, чем" однострочные " с помощью карта или forEach. Короткая рука foreach и карта может быть трудно понять, так как логика является более абстрактным.
попробуйте это, я проверил это:
let theSubviews = container_view.subviews for subview in theSubviews { subview.removeFromSuperview() }
Для Swift 3
Я сделал следующее, потому что просто удаление из superview не стерло кнопки из массива.
for k in 0..<buttons.count { buttons[k].removeFromSuperview() } buttons.removeAll()
вы пробовали что-то вроде
for o : AnyObject in self.subviews { if let v = o as? NSView { v.removeFromSuperview() } }
Comments