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

Как удалить все объекты в представлении 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)
}

Что мне не хватает?

UPDATE

У моего приложения есть основной container_view. Я должен добавить другие другие представления в качестве подзаголовков в container_view, чтобы обеспечить своего рода навигацию.

Итак, при нажатии кнопки "открыть" конкретную страницу мне нужно удалить allsubviews и добавить новый.

ОБНОВЛЕНИЕ 2 - Рабочее решение (OS X)

Я предполагаю, что Apple исправила его.

Теперь это проще, чем когда-либо, просто позвоните:

for view in containerView.subviews{
    view.removeFromSuperview()
}
4b9b3361

Ответ 1

EDIT: (спасибо Иеремии/Ролло)

Самым лучшим способом сделать это в Swift для iOS является:

view.subviews.forEach({ $0.removeFromSuperview() }) // this gets things done
view.subviews.map({ $0.removeFromSuperview() }) // this returns modified array

^^ Эти функции забавны!

let funTimes = ["Awesome","Crazy","WTF"]
extension String { 
    func readIt() {
        print(self)
    }
}

funTimes.forEach({ $0.readIt() })

////END EDIT

Просто сделайте следующее:

for view in self.view.subviews {
    view.removeFromSuperview()
}

Или, если вы ищете определенный класс

for view:CustomViewClass! in self.view.subviews {
        if view.isKindOfClass(CustomViewClass) {
            view.doClassThing()
        }
    }

Ответ 2

Для iOS/Swift, чтобы избавиться от всех подзонов, я использую:

for v in view.subviews{
   v.removeFromSuperview()
}

чтобы избавиться от всех подзонов определенного класса (например, UILabel), я использую:

for v in view.subviews{
   if v is UILabel{
      v.removeFromSuperview()
   }
}

Ответ 3

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

view.subviews.forEach { $0.removeFromSuperview() }

Ответ 4

Это должно быть самое простое решение.

let container_view: NSView = ...
container_view.subviews = []

(см. Удалить все подпредставления?, чтобы узнать о других методах)


Обратите внимание, что это MacOS вопрос, и этот ответ работает только для MacOS. Это не работает на iOS.

Ответ 5

Попробуйте следующее:

for view in container_view.subviews {
    view.removeFromSuperview()
}

Ответ 6

Я не знаю, удалось ли вам решить эту проблему, но я недавно испытал аналогичную проблему, когда цикл For оставил одно представление каждый раз. Я нашел это потому, что self.subviews был мутирован (возможно), когда вызывается removeFromSuperview().

Чтобы исправить это, я сделал:

let subViews: Array = self.subviews.copy()
for (var subview: NSView!) in subViews
{
    subview.removeFromSuperview()
}

Выполняя .copy(), я мог бы выполнить удаление каждого subview во время мутации массива self.subviews. Это связано с тем, что скопированный массив (subViews) содержит все ссылки на объекты и не мутирован.

EDIT: В вашем случае я думаю, что вы будете использовать:

let theSubviews: Array = container_view.subviews.copy()
for (var view: NSView!) in theSubviews
{
    view.removeFromSuperview()
}

Ответ 7

Расширение для удаления всех подзапросов, оно быстро удаляется.

import Foundation
import UIKit

extension UIView {
    /// Remove allSubView in view
    func removeAllSubViews() {
        self.subviews.forEach({ $0.removeFromSuperview() })
    }

}

Ответ 8

Попробуйте следующее:

var subViews = parentView.subviews as Array<UIView>

      for someView in subViews
      {
          someView.removeFromSuperview()
      }

UPDATE. Если вы чувствуете себя авантюристом, вы можете сделать расширение на UIView, как показано ниже:

extension UIView
{
    func removeAllSubViews()
    {
       for subView :AnyObject in self.subviews
       {
            subView.removeFromSuperview()
       }
    }

}

И назовите его следующим образом:

parentView.removeAllSubViews()

Ответ 9

В xcodebeta6 это сработало.

    var subViews = self.parentView.subviews
    for subview in subViews as [UIView]   {
        subview.removeFromSuperview()
    }

Ответ 10

Я написал это расширение:

extension UIView {
    func lf_removeAllSubviews() {
        for view in self.subviews {
            view.removeFromSuperview()
        }
    }
}

Чтобы вы могли использовать self.view.lf_removeAllSubviews в UIViewController. Я положу это в более быструю версию своего https://github.com/superarts/LFramework позже, когда у меня больше опыта в быстрой (1 день опыта до сих пор, и да, для API я отказался от подчеркивания).

Ответ 11

Ваш синтаксис слегка выключен. Убедитесь, что вы явно указали.

 let theSubviews : Array<NSView> = container_view.subviews as Array<NSView>
 for view in theSubviews {
     view.removeFromSuperview()
 }

Ответ 12

вы должны попробовать это

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

Ответ 13

Swift 3

Если вы добавите тег в свой вид, вы можете удалить определенный вид.

for v in (view?.subviews)!
{
    if v.tag == 321
    {
         v.removeFromSuperview()
    }
 }

Ответ 14

Попробуйте, я проверил это:

  let theSubviews = container_view.subviews
  for subview in theSubviews {
      subview.removeFromSuperview()
  }

Ответ 15

Для удаления только подсмотров определенного класса - это был единственный код Swift, который работал у меня в Xcode6.1.1. Предполагая, что единственные объекты, которые вы хотите удалить, имеют тип UIButton...

for subView in nameofmysuperview.subviews {
    if subView.isKindOfClass(UIButton) {
        subView.removeFromSuperview()
    }
}

Ответ 16

Однострочник:

while(view.subviews.count > 0) {(view.subviews[0] as NSView).removeFromSuperview()}

Я думаю, что этот подход более читабельен, чем "однострочные", используя карту или для каждого. Короткая комбинация foreach и карта может быть трудно понять, так как логика более абстрактна.

Ответ 17

Для Swift 3

Я сделал следующее, потому что просто удаление из супервизора не стирало кнопки из массива.

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

Ответ 18

Для Swift 4.+

extension UIView {
     public func removeAllSubViews() {
          self.subviews.forEach({ $0.removeFromSuperview() })

}

Я надеюсь, что это полно для вас.

Ответ 19

(извините, нет репутации, чтобы ответить Bseaborn) Это отлично работает в быстрой 4:

view.subviews.forEach({ $0.removeFromSuperview() }) 

Ответ 20

Swift 5.0

Я создаю 2 разных метода для удаления подпредставления. И это гораздо проще использовать, если мы поместим их в extension

extension UIView {
    /// Remove all subview
    func removeAllSubviews() {
        subviews.forEach { $0.removeFromSuperview() }
    }

    /// Remove all subview with specific type
    func removeAllSubviews<T: UIView>(type: T.Type) {
        subviews
            .filter { $0.isMember(of: type) }
            .forEach { $0.removeFromSuperview() }
    }
}

Ответ 21

Вы попробовали что-то вроде

for o : AnyObject in self.subviews {
     if let v = o as? NSView {
         v.removeFromSuperview()
     }
}