Как удалить все подвиды вида в 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()
}
829   18  

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()
   }
}

код может быть написан проще, как показано ниже.

view.subviews.forEach { .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()
}

попробуйте это:

for view in container_view.subviews {
    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

    Ничего не найдено.