Görünümde bir alt görünüm olup olmadığını kontrol edin


97

Ben kullanarak bir görünüme bir subview eklemek bir uygulamayı yapıyorum addSubview:bir de IBAction. Aynı şekilde, bu düğmeye IBActiontekrar dokunulduğunda removeFromSuperview, buna eklenen alt görünümü çağırmalısınız IBAction:

PSEUDO KODU

-(IBAction)showPopup:(id)sender 
{
    System_monitorAppDelegate *delegate = (System_monitorAppDelegate *)[[UIApplication sharedApplication] delegate];
    UIView *rootView = delegate.window.rootViewController.view;

    if([self popoverView] is not on rootView) 
    { 
        [rootView addSubview:[self popoverView]];
    } 
    else 
    {
        [[self popoverView] removeFromSuperview];
    }

}

Yanıtlar:


271

Muhtemelen UIView sınıf referansında-(BOOL)isDescendantOfView:(UIView *)view; alınan UIView'leri arıyorsunuz .

Dönüş Değeri EVET, alıcı hemen veya uzak bir görüş alt görünümüyse veya görüş, alıcının kendisiyse; aksi takdirde HAYIR.

Aşağıdaki gibi bir kodla sonuçlanacaksınız:

Amaç-C

- (IBAction)showPopup:(id)sender {
    if(![self.myView isDescendantOfView:self.view]) { 
        [self.view addSubview:self.myView];
    } else {
        [self.myView removeFromSuperview];
    }
}

Hızlı 3

@IBAction func showPopup(sender: AnyObject) {
    if !self.myView.isDescendant(of: self.view) {
        self.view.addSubview(self.myView)
    } else {
        self.myView.removeFromSuperview()
    }
}

2
Çalışmıyor, sadece üzerine görünümü ekliyor. Gerçek durumu göstermek için kodu düzenleyeceğim
pmerino

@ zad0xsis - Gerçek durumu anlamıyorum. Kullandığınız ikinci görünümü eklediyseniz addSubview:, bir dahaki sefere (muhtemelen durum ilk kez) yöntemini ikinci görünümü artık çünkü, başka bir parçasını ulaşırsınız olan ilk bir Subview. Yapmaya çalıştığın şey değil mi? Modal olarak bir görünüm denetleyicisini yönlendirmek gibi başka bir mekanizma arıyorsunuz belki?

iyi, popoverViewrootView'ın (rootViewController) bir alt görünümüdür. Ekranda olup olmadığını kontrol etmek istiyorum (süpervizör olarak rootView varsa) ve öyleyse kaldırın ya da yoksa ekleyin
pmerino

olan [self popoverView]yeni her zaman popover oluşturulan dönen? aynı görünüm ise "üzerine" bir görünüm ekleyemez, zaten işlemsiz bir görünüm ekleyemez. eğer popoverViewyöntem yenisini her zaman yaratıyor, sonra herzaman görünüm hiyerarşisi içinde olmayacak
bshirley

1
Burada beni şaşırtan önemli bir husus: IBOutlet özellikleriyle (veya ivarlarla) tuttuğunuz alt görünümleri kaldırıp eklerken, özelliklerin (ivarlar) güçlü olduğundan veya (ARC öncesi ) korunduğundan emin olmanız gerekir. . Varsayılan olarak, bir çıkış oluşturmak için bir görünümden bir denetleyiciye ctrl-sürüklerseniz, onu zayıf olarak oluşturur çünkü uçta oluşturulan görünümün ona sahip olacağını varsayar, bu nedenle güçlü bir referansa ihtiyacınız yoktur. Ancak daha sonra onu programlı olarak kaldırırsanız, denetimi kaldırır ve referansınızı sıfıra (ARC'de) ayarlar.
Rhubarb

18

Bunu dene:

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}

harika! bazen myView.view.superview'a ihtiyaç duyar, ancak benim için sihir gibi çalıştı. Teşekkürler @MarkGranoff
Lior Frenkel

11
    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }

Çalışmıyor, sadece üzerine görünümü ekliyor. Gerçek durumu göstermek için kodu düzenleyeceğim - zad0xsis 1 dakika önce düzenleme
pmerino

12
@pmerino "zad0xsis 1 dakika önce düzenle" yi de kopyaladığınız için tembel olduğun için tebrikler :-)
Thomas Kekeisen

Dürüst olmak gerekirse, bunun diğer çözümlerden daha pahalı olduğunu düşünüyorum çünkü tüm alt görünümleri yinelemesi gerekiyor
SimplyKiwi

4

Swift eşdeğeri şuna benzer:

if(!myView.isDescendantOfView(self.view)) {
    self.view.addSubview(myView)
} else {
    myView.removeFromSuperview()
}

2

Alt görünümün gözetim görünümünü kontrol edin ...

-(IBAction)showPopup:(id)sender {
    if([[self myView] superview] == self.view) { 
        [[self myView] removeFromSuperview];           
    } else {
        [self.view addSubview:[self myView]];         
    }
}

1

If durumunuz gibi gitmeli

if (!([rootView subviews] containsObject:[self popoverView])) { 
    [rootView addSubview:[self popoverView]];
} else {
    [[self popoverView] removeFromSuperview];

}

Bu, Michael Frederick'in cevabının küçük bir değişikliğidir. Vincent'ın kullandığı koddan farklı sonuçlar veriyor mu isDescendantOfView:?
paulmelnikow

Kesinlikle farklı bir sonuç verir. Bu sadece bir torun mu yoksa torun mu yoksa çocuk mu olduğunu kontrol eder.
Sami Samhuri

0

Burada iki farklı görüş kullandık. Üst görünüm, alt görünümü aradığımız ve üst görünüme eklenip eklenmediğini kontrol ettiğimiz görünümdür.

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.