स्विफ्ट में एक दृश्य के सभी साक्षात्कार कैसे निकालें?


176

मैं एक-एक करके सभी उप-साक्षात्कारों को एक बार में हटाने के बजाय एक-एक करके निकालने के लिए एक सरल विधि की तलाश कर रहा हूं।

//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 - एक काम कर समाधान (ओएस एक्स)

मुझे लगता है कि Apple ने इसे ठीक किया।

अब यह पहले से कहीं अधिक आसान है, बस कॉल करें:

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

2
मैं यह बताना चाहता हूं कि @ सुल्तान का जवाब, जबकि लत्ता के साथ दफन है, बेहतर जवाब है: stackoverflow.com/questions/24312760/…
क्रिस्टोफर स्वासी

@ChristopherSwasey स्विफ्ट 4 एक त्रुटि देता है: संपत्ति को असाइन नहीं किया जा सकता: 'साक्षात्कार' एक केवल प्राप्त संपत्ति है। :(
विलियम टी। मलार्ड

2
@ WilliamT.Mallard को कितनी बार दोहराया जाना है कि यह तरीका और सवाल MacOS के बारे में है न कि iOS के लिए?
फोगमिस्टर

जवाबों:


358

संपादित करें: (धन्यवाद जेरेमिया / रोलो)

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

Xcode 7.0 बीटा 6 में यह एक चेतावनी उत्पन्न करता है: "मैप पर कॉल का परिणाम अप्रयुक्त है"। मुझे उम्मीद है कि यह अंतिम संस्करण में तय हो गया है।
फॉर्स आर्क नाएज

मैंने भी उसपर ध्यान दिया! Xcode बीटा से बाहर आने के बाद मैं पोस्ट अपडेट करूंगा और समस्या अभी भी बनी हुई है।
बैसबॉर्न

8
चेतावनी, 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() }
इटांगर

मेरा तर्क है कि यह "स्विफ्ट में ऐसा करने का अब तक का सबसे अच्छा तरीका है", stackoverflow.com/a/24314054/1974224
क्रिश्चिक

41

IOS / Swift के लिए, मेरे द्वारा उपयोग किए जाने वाले सभी साक्षात्कारों से छुटकारा पाने के लिए:

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

एक विशेष वर्ग (जैसे कि उइबेल) के सभी उपखंडों से छुटकारा पाने के लिए मैं उपयोग करता हूं:

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

31

निम्नलिखित के रूप में कोड को सरल लिखा जा सकता है।

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

18

यह सबसे सरल उपाय होना चाहिए।

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

( अन्य विधियों के लिए सभी साक्षात्कार निकालें देखें )


ध्यान दें कि यह एक MacOS प्रश्न है और यह उत्तर केवल MacOS के लिए काम करता है । यह iOS पर काम नहीं करता है।


यह निश्चित रूप से सबसे सरल तरीका है ... removeFromSuperview स्वचालित रूप से प्रत्येक दृश्य के लिए कहा जाता है जो अब सबव्यू सरणी में नहीं है।
क्रिस्टोफर स्वासी

2
@datay Yes वे नहीं हैं लेकिन NSView(OS X) और UIView(iOS) के बीच एक बड़ा अंतर है ।
सुल्तान

@ सुल्तान आप सही कह रहे हैं। मैं यहां
उविवि के

1
स्विफ्ट 4 एक त्रुटि देता है: संपत्ति को असाइन नहीं किया जा सकता है: 'साक्षात्कार' एक संपत्ति है। :(
विलियम टी। मल्लार्ड

1
@AmrAngry फिर से, मैं दोहराता हूं, यह हमेशा एक मैक ओएस सवाल था, NSViewआईओएस और के लिए नहीं UIView। केवल लोगों को सवाल और टैग पढ़ने की परवाह नहीं है, इसलिए यह iOS उत्तरों से भरा हुआ है।
सुल्तान

10

मैं नहीं जानता कि क्या आप इसे हल करने में कामयाब रहे हैं, लेकिन मुझे हाल ही में एक ऐसी ही समस्या का सामना करना पड़ा है, जहां हर बार फॉर लूप ने एक दृश्य छोड़ दिया है। मुझे यह इसलिए मिला क्योंकि self.subviews का म्यूटेशन किया गया था (हो सकता है) जब removeFromSuperview () को बुलाया गया था।

इसे ठीक करने के लिए मैंने किया:

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

.Copy () करके, मैं self.subviews एरे को म्यूट करते हुए प्रत्येक सबव्यू को हटाने का प्रदर्शन कर सकता हूं। ऐसा इसलिए है क्योंकि कॉपी किए गए एरे (सब व्यू) में ऑब्जेक्ट्स के सभी संदर्भ होते हैं और उन्हें उत्परिवर्तित नहीं किया जाता है।

संपादित करें: आपके मामले में मुझे लगता है कि आप इसका उपयोग करेंगे:

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

ठीक काम करता है! धन्यवाद
अल्बर्टो बेलिनी

नमस्कार, निम्नलिखित को आज़माएं, हालांकि ऐसा करने के लिए शायद अधिक सुंदर तरीका है: let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
एडम रिचर्ड्स

9

इसे इस्तेमाल करे:

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

9

सभी साक्षात्कारों को हटाने के लिए एक्सटेंशन, इसे जल्दी से हटा दिया जाता है।

import Foundation
import UIKit

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

}

1
नक्शा क्यों? शायद हो सकता है? उप-साक्षात्कार। प्रत्येक {$ 0.removeFromSuperview ()}
Zaporozhchenko ऑलेक्ज़ेंडर

1
हां आप सही है @ अलेक्जेंडर मुझे लगता है कि जब मैं यह लिख रहा था, तो मैंने अपनी कॉफी नहीं ली थी
YannSteph

6

इसे इस्तेमाल करे:

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

2 छोटी चीजें: मैं osx पर काम कर रहा हूं, इसलिए यह <NSView> सही होगा? फिर, मुझे "घातक त्रुटि: अर्रे इंडेक्स ऑफ़ रेंज" मिल रहा है: /
अल्बर्टो बेलिनी

हां, मुझे लगता है कि OSX पर यह NSView है। आपको घातक त्रुटि कहां से मिली?
अज़मशरप

क्या आप सुनिश्चित हैं कि आपके माता-पिता के पास बाल तत्व हैं?
अज़मशरप

हां ! अगर मैं एक प्रिंटल (parentView.subviews) बनाऊं तो मुझे 1
अल्बर्टो बेलिनी

यह अजीब है! आमतौर पर सीमा से बाहर होने का मतलब है कि आप एक इंडेक्स का उपयोग कर रहे हैं जो मौजूद नहीं है और आमतौर पर मेरा मानना ​​है कि यह i ++ जैसे इंडेक्स वाले लूप का उपयोग करने के कारण होता है।
अज़मशरप


3

मैंने यह एक्सटेंशन लिखा है:

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

ताकि आप UIViewController में self.view.lf_removeAllSubviews का उपयोग कर सकें। मैं इसे बाद में अपने https://github.com/superarts/LFramework के स्विफ्ट संस्करण में डालूंगा , जब मुझे स्विफ्ट में अधिक अनुभव (1 दिन अब तक एक्सपोज़, और हां, एपीआई के लिए मैंने अंडरस्कोर छोड़ दिया है)।


3

स्विफ्ट 3

यदि आप अपने दृश्य में एक टैग जोड़ते हैं तो आप एक विशिष्ट दृश्य निकाल सकते हैं।

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

क्यों नहीं view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})?
अलेक्जेंडर

3

स्विफ्ट 5

मैं सबव्यू हटाने के लिए 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() }
    }
}

2

आपका सिंटैक्स थोड़ा हटकर है। सुनिश्चित करें कि आपने स्पष्ट रूप से डाली है।

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

@ डेविड यह होगा, मैंने इसे फॉक्सनोस के शुरुआती कोड के जितना संभव हो उतना करीब रखने की कोशिश की।
जैक

2

आपको यह कोशिश करनी होगी

func clearAllScrollSubView ()
{
    let theSubviews = itemsScrollView.subviews

    for (var view) in theSubviews
    {

        if view is UIView
        {
            view.removeFromSuperview()
        }

    }
}

वह यूआई नहीं एनएस है। यहाँ हम OS X के बारे में बात कर रहे हैं। अगर वह NS के साथ UI को बदलकर भी काम करता है, तो मेरा बुरा, आप सही थे :)
Alberto Bellini

1

एक विशिष्ट वर्ग के सिर्फ साक्षात्कार को हटाने के लिए - यह एकमात्र स्विफ्ट कोड था जो मेरे लिए Xcode6.1.1 में काम करता था। केवल उप-परीक्षाओं को आप हटाना चाहते हैं मान लें कि UIButton ...

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

1

एक लाइन:

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

मुझे लगता है कि यह दृष्टिकोण "वन-लाइनर्स" की तुलना में मैप या फॉरएच का उपयोग करने से अधिक पठनीय है । लघु हाथ foreach और नक्शा , समझने के लिए मुश्किल हो सकता है के रूप में तर्क और अधिक सार है।


1

स्विफ्ट 3 के लिए

मैं निम्नलिखित के रूप में किया क्योंकि सिर्फ पर्यवेक्षण से हटाने से सरणी से बटन मिटा नहीं था।

    for k in 0..<buttons.count {

      buttons[k].removeFromSuperview()

    }


    buttons.removeAll()

1

इसे आज़माएं, मैंने इसका परीक्षण किया:

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

1

के लिये Swift 4.+

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

}

मुझे आशा है कि यह आपके लिए पूर्ण उपयोग है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.