Yanıtlar:
Düzenleme: kakaofan sayesinde : Bu durum gerçeği ile karıştırılır NSView
ve UIView
farklı şeyler ele. İçin NSView
(sadece masaüstü Mac geliştirme), sadece aşağıdaki kullanabilirsiniz:
[someNSView setSubviews:[NSArray array]];
İçin UIView
(yalnızca iOS geliştirme), güvenle kullanabilirsiniz makeObjectsPerformSelector:
çünkü subviews
bu tesiste dönecektir kopyasını subviews dizisinin:
[[someUIView subviews]
makeObjectsPerformSelector:@selector(removeFromSuperview)];
Tommy , numaralandırılırken diziyi makeObjectsPerformSelector:
değiştirdiği anlaşılan işaret için teşekkür ederiz subviews
(ki bunun için yapar NSView
, ancak değil UIView
).
Daha fazla ayrıntı için lütfen bu SO sorusuna bakın.
Not: Bu iki yöntemden herhangi biri kullanıldığında, ana görünümünüzün içerdiği her görünüm kaldırılır ve başka bir yerde saklanmazlarsa bu görünümler serbest bırakılır . Apple'ın removeFromSuperview ile ilgili belgelerinden :
Alıcının denetimi sıfır değilse, bu yöntem alıcıyı serbest bırakır. Görünümü yeniden kullanmayı planlıyorsanız, bu yöntemi çağırmadan önce koruduğunuzdan emin olun ve işiniz bittiğinde veya başka bir görünüm hiyerarşisine ekledikten sonra uygun şekilde bıraktığınızdan emin olun.
UIView
döner bir kopyası ait subviews
değişken dizisi bu kod sadece çalışır böylece. Aynı kodun bir istisna atacağı masaüstünde tamamen farklı bir hikaye. Bkz. Stackoverflow.com/questions/4665179/…
someUIView.Subviews.All( v => { v.RemoveFromSuperview(); return true; } );
. Ne demek istediğini söylemek için temizleyici someUIView.Subviews.ToList().ForEach( v => v.RemoveFromSuperview() );
.
Kök denetleyicinizden tüm alt görünümleri alın ve her birine bir removeLromSuperview gönderin:
NSArray *viewsToRemove = [self.view subviews];
for (UIView *v in viewsToRemove) {
[v removeFromSuperview];
}
self.view
senin gibi kullanmalıydım.
for (UIView *v in [self.view subviews])
daha kolay
In Swift bir kullanabilirsiniz işlevsel yaklaşım böyle:
view.subviews.forEach { $0.removeFromSuperview() }
Bir karşılaştırma olarak, zorunlu yaklaşım şöyle görünecektir:
for subview in view.subviews {
subview.removeFromSuperview()
}
Bu kod snippet'leri yalnızca iOS / tvOS'ta çalışır, ancak macOS'ta işler biraz farklıdır.
(subviews as [UIView]).map { $0.removeFromSuperview() }
.map
. Bu saf bir yan etkidir ve daha iyi şu şekilde ele alınır:view.subviews.forEach() { $0.removeFromSuperview() }
UIView'inizdeki tüm alt görünümleri kaldırmak istiyorsanız (burada yourView
), bu düğmeyi düğme tıklamanıza yazın:
[[yourView subviews] makeObjectsPerformSelector: @selector(removeFromSuperview)];
İOS'ta dizinin bir kopyası tutulduğu için bu yalnızca OSX için geçerlidir
Tüm alt görünümleri kaldırırken, dizinin sonunda silmeye başlamak ve siz başlangıca ulaşıncaya kadar silmeye devam etmek iyi bir fikirdir. Bu, bu iki kod satırı ile gerçekleştirilebilir:
for (int i=mySuperView.subviews.count-1; i>=0; i--)
[[mySuperView.subviews objectAtIndex:i] removeFromSuperview];
SWIFT 1.2
for var i=mySuperView.subviews.count-1; i>=0; i-- {
mySuperView.subviews[i].removeFromSuperview();
}
veya (daha az verimli, ancak daha okunabilir)
for subview in mySuperView.subviews.reverse() {
subview.removeFromSuperview()
}
NOT
Sen gerektiğini DEĞİL önce UIView örneği silinirse o çökmesine neden olabileceğinden, normal sırada subviews kaldırmak removeFromSuperview
mesaj dizinin tüm nesnelere gönderildi. (Açıkçası, son öğenin silinmesi çökmeye neden olmaz)
Bu nedenle, kod
[[someUIView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
gerektiğini DEĞİL kullanılan olabilir.
Dan alıntı makeObjectsPerformSelector hakkında Elma belgelerinde :
Dizideki her bir nesneye, ilk nesneden başlayarak ve dizi boyunca son nesneye devam ederek belirli bir seçici tarafından tanımlanan iletiyi gönderir.
(bu amaç için yanlış yön olur)
removeFromSuperview
, UIView diziden kaldırılır ve UIView ile güçlü bir ilişkisi olan başka canlı örnek yoksa UIView de silinir. Bu, sınır dışı bir istisnaya neden olabilir.
[yourView subviews]
dizinin bir KOPYASINI döndürüyor, bu nedenle güvenlidir. (OSX'te söylediklerinizin doğru olduğunu unutmayın.)
Bu şekilde hızlı 2.0 deneyin
view.subviews.forEach { $0.removeFromSuperview() }
forEach
temel çözüm sizinkinden sonra eklendi, bunu kaçırdım. Özür.
Tüm alt görünümleri kaldırmak için Aşağıdaki kodu kullanın.
for (UIView *view in [self.view subviews])
{
[view removeFromSuperview];
}
Tüm alt görünümleri sözdizimini kaldırmak için:
- (void)makeObjectsPerformSelector:(SEL)aSelector;
Kullanımı:
[self.View.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
Bu yöntem NSArray.h dosyasında bulunur ve NSArray (NSExtendedArray) arabirimini kullanır
Swift kullanıyorsanız, bu kadar basit:
subviews.map { $0.removeFromSuperview }
Felsefede makeObjectsPerformSelector
yaklaşımla benzerdir , ancak biraz daha güvenlikle.
map
yan etkilere neden olmamalıdır. Ayrıca, aynı sonuç üzerinden de elde edilebilir forEach
.
Autolayout kullanan ios6 için de kısıtlamaları kaldırmak için biraz kod eklemek zorunda kaldım.
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)];
Eminim bunu yapmanın daha temiz bir yolu var, ama benim için çalıştı. Benim durumumda [tagview removeConstraints:tagview.constraints]
XCode'da temizlenen kısıtlamalar olduğu için doğrudan kullanamadım .
Monotouch / xamarin.ios'ta bu benim için çalıştı:
SomeParentUiView.Subviews.All(x => x.RemoveFromSuperview);
Tüm alt görünümleri denetim ekranlarından kaldırmak için:
NSArray *oSubView = [self subviews];
for(int iCount = 0; iCount < [oSubView count]; iCount++)
{
id object = [oSubView objectAtIndex:iCount];
[object removeFromSuperview];
iCount--;
}
iCount++
ve iCount--
dizini aynı bırakarak, eğer sonsuz bir döngü olacaktır [oSubView count]>0
. Bu kesinlikle buggy ve DEĞİL KULLANILABİLİR kodu.