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