जवाबों:
संपादित करें: करने के लिए धन्यवाद के साथ cocoafan : यह स्थिति ऊपर तथ्य यह है कि द्वारा अव्यवस्थित है NSView
और UIView
संभाल कुछ अलग। केवल NSView
(डेस्कटॉप मैक विकास के लिए), आप बस निम्नलिखित का उपयोग कर सकते हैं:
[someNSView setSubviews:[NSArray array]];
के लिए UIView
(केवल iOS विकास), आप सुरक्षित रूप से उपयोग कर सकते हैं makeObjectsPerformSelector:
क्योंकि subviews
संपत्ति एक वापस आ जाएगी प्रति subviews के सरणी के:
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
यह इंगित करने के लिए कि यह संशोधित किया जा रहा है, जबकि सरणी को संशोधित करने के लिए प्रकट होता है, जो इंगित करने के लिए टॉमी के लिए धन्यवाद (जो इसके लिए नहीं, लेकिन )।makeObjectsPerformSelector:
subviews
NSView
UIView
अधिक विवरण के लिए कृपया इस SO प्रश्न को देखें।
नोट: इन दोनों विधियों में से किसी एक का उपयोग करने से आपके मुख्य दृश्य में मौजूद हर दृश्य को हटा दिया जाएगा और उन्हें जारी कर दिया जाएगा , अगर वे कहीं और बनाए नहीं रखे जाते हैं। RemoveFromSuperview पर Apple के प्रलेखन से :
यदि रिसीवर का सुपरवाइज शून्य नहीं है, तो यह विधि रिसीवर को रिलीज़ करती है। यदि आप दृश्य को पुन: उपयोग करने की योजना बनाते हैं, तो इस पद्धति को कॉल करने से पहले इसे बनाए रखना सुनिश्चित करें और जब आप इसके साथ किए जाते हैं या किसी अन्य दृश्य पदानुक्रम में जोड़ने के बाद इसे जारी करना सुनिश्चित करें।
UIView
एक प्रति लौटाता है subviews
, इसलिए यह कोड बस काम करता है। डेस्कटॉप पर पूरी तरह से अलग कहानी, जहां एक ही कोड अपवाद फेंक देगा। देख stackoverflow.com/questions/4665179/...
someUIView.Subviews.All( v => { v.RemoveFromSuperview(); return true; } );
। IMHO क्लीनर कहने के लिए कि आपका क्या मतलब है someUIView.Subviews.ToList().ForEach( v => v.RemoveFromSuperview() );
:।
अपने रूट कंट्रोलर से सभी सबव्यू प्राप्त करें और प्रत्येक को एक निष्कासन भेजें:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
self.view
आपके जैसा होना चाहिए था।
for (UIView *v in [self.view subviews])
इसका आसान
में स्विफ्ट आप एक का उपयोग कर सकते कार्यात्मक दृष्टिकोण इस तरह:
view.subviews.forEach { $0.removeFromSuperview() }
तुलना के रूप में, अनिवार्य दृष्टिकोण इस तरह होगा:
for subview in view.subviews {
subview.removeFromSuperview()
}
ये कोड स्निपेट केवल iOS / tvOS में काम करते हैं, हालांकि, चीजें macOS पर थोड़ी भिन्न होती हैं।
(subviews as [UIView]).map { $0.removeFromSuperview() }
.map
। यह एक शुद्ध साइड इफेक्ट है और इस तरह से बेहतर तरीके से नियंत्रित किया जाता है:view.subviews.forEach() { $0.removeFromSuperview() }
यदि आप अपने UIView (यहाँ yourView
) पर सभी उपखंडों को हटाना चाहते हैं , तो इस कोड को अपने बटन पर क्लिक करें:
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
यह केवल OSX पर लागू होता है क्योंकि iOS में सरणी की एक प्रति रखी जाती है
सभी साक्षात्कारों को हटाते समय, सरणी के अंत में डिलीट करना शुरू करना एक अच्छा विचार है और शुरुआत तक पहुंचने तक हटाते रहें। इसे कोड की दो पंक्तियों के साथ पूरा किया जा सकता है:
for (int i=mySuperView.subviews.count-1; i>=0; i--)
[[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
स्विफ्ट 1.2
for var i=mySuperView.subviews.count-1; i>=0; i-- {
mySuperView.subviews[i].removeFromSuperview();
}
या (कम कुशल, लेकिन अधिक पठनीय)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
ध्यान दें
आपको सामान्य क्रम में साक्षात्कार नहीं हटाने चाहिए , क्योंकि इससे दुर्घटना हो सकती है यदि UIView उदाहरण से पहले हटा दिया जाएremoveFromSuperview
संदेश के सभी ऑब्जेक्ट्स को भेजे जाने । (जाहिर है, अंतिम तत्व को हटाने से दुर्घटना नहीं होगी)
इसलिए, कोड
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
नहीं चाहिएउपयोग किया ।
MakeObjectsPerformSelector के बारे में Apple प्रलेखन से उद्धरण :
किसी ऑब्जेक्ट में दिए गए चयनकर्ता द्वारा पहचाने गए एरे में प्रत्येक ऑब्जेक्ट को भेजता है, पहली ऑब्जेक्ट से शुरू होता है और एरे से आखिरी ऑब्जेक्ट तक जारी रहता है।
(जो इस उद्देश्य के लिए गलत दिशा होगी)
removeFromSuperview
खत्म हो जाता है, तो UIView को सरणी से हटा दिया जाएगा, और अगर UIView के साथ एक मजबूत संबंध के साथ कोई अन्य जीवित उदाहरण नहीं हैं, तो UIView को भी हटा दिया जाएगा। यह बाध्य अपवाद के कारण हो सकता है।
[yourView subviews]
सरणी का एक COPY लौटाता है, इसलिए सुरक्षित है। (ध्यान दें कि OSX पर, आप जो कहते हैं वह सही है।)
इस तरह से ट्राई करें 2.0
view.subviews.forEach { $0.removeFromSuperview() }
forEach
आपके बाद आधारित समाधान जोड़ा गया था, मुझे याद आया। क्षमा याचना।
सभी साक्षात्कारों को हटाने के लिए निम्नलिखित कोड का उपयोग करें।
for (UIView *view in [self.view subviews])
{
[view removeFromSuperview];
}
सभी सबटैक्स को हटाने के लिए सिंटैक्स:
- (void)makeObjectsPerformSelector:(SEL)aSelector;
उपयोग:
[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
यह विधि NSArray.h फ़ाइल में मौजूद है और NSArray (NSExtendedArray) इंटरफ़ेस का उपयोग करती है
यदि आप स्विफ्ट का उपयोग कर रहे हैं, तो यह उतना ही सरल है:
subviews.map { $0.removeFromSuperview }
यह makeObjectsPerformSelector
दृष्टिकोण के दर्शन के समान है , हालांकि थोड़ी अधिक प्रकार की सुरक्षा के साथ।
map
इसके दुष्प्रभाव नहीं होने चाहिए। इसके अलावा, एक ही परिणाम के माध्यम से प्राप्त किया जा सकता है forEach
।
Ios6 के लिए ऑटोलेयूट का उपयोग करके मुझे बाधाओं को हटाने के लिए थोड़ा सा कोड भी जोड़ना पड़ा।
NSMutableArray * constraints_to_remove = [ @[] mutableCopy] ;
for( NSLayoutConstraint * constraint in tagview.constraints) {
if( [tagview.subviews containsObject:constraint.firstItem] ||
[tagview.subviews containsObject:constraint.secondItem] ) {
[constraints_to_remove addObject:constraint];
}
}
[tagview removeConstraints:constraints_to_remove];
[ [tagview subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
मुझे यकीन है कि ऐसा करने के लिए एक नीटर तरीका है, लेकिन यह मेरे लिए काम करता है। मेरे मामले में मैं एक प्रत्यक्ष का उपयोग नहीं कर सका [tagview removeConstraints:tagview.constraints]
क्योंकि XCode में बाधाएं थीं जो साफ हो रही थीं।
मोनोटॉक / xamarin.ios में यह मेरे लिए काम करता है:
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);
पर्यवेक्षण से सभी साक्षात्कारों को हटाने के लिए:
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}
iCount++
और iCount--
, सूचकांक को एक ही छोड़ रहे हैं, इसलिए यह एक अनंत लूप होगा यदि [oSubView count]>0
। यह निश्चित रूप से छोटी गाड़ी है और उपयोग करने योग्य कोड नहीं है ।