Periksa apakah subview dalam tampilan

97

Saya membuat aplikasi tempat saya menambahkan subview ke tampilan menggunakan addSubview:di IBAction. Dengan cara yang sama, ketika tombol dengan yang IBActiondisentuh lagi harus memanggil removeFromSuperviewsubview yang ditambahkan itu IBAction:

KODE PSEUDO

-(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];
    }

}
pmerino
sumber

Jawaban:

271

Anda mungkin mencari UIView yang -(BOOL)isDescendantOfView:(UIView *)view;diambil dalam referensi kelas UIView .

Kembalikan Nilai YA jika penerima adalah pandangan langsung atau jauh atau jika pandangan adalah penerima itu sendiri; jika tidak TIDAK.

Anda akan mendapatkan kode seperti:

Objective-C

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

Cepat 3

@IBAction func showPopup(sender: AnyObject) {
    if !self.myView.isDescendant(of: self.view) {
        self.view.addSubview(self.myView)
    } else {
        self.myView.removeFromSuperview()
    }
}
palme
sumber
2
Tidak berfungsi, cukup tambahkan tampilan di atasnya. Saya akan mengedit kode untuk menunjukkan kasus yang sebenarnya
pmerino
@ zad0xsis - Saya tidak mengerti kasus sebenarnya. Jika Anda menambahkan tampilan kedua menggunakan addSubview:metode (yang mungkin terjadi pertama kali), di lain waktu, Anda akan mencapai bagian lain karena tampilan kedua sekarang adalah subview dari yang pertama. Bukankah itu yang Anda coba lakukan? Anda mungkin mencari mekanisme lain seperti memberikan pengontrol tampilan secara sederhana?
baik, popoverViewadalah subview dari rootView (rootViewController). Saya ingin memeriksa apakah ada di layar (jika memiliki rootView sebagai superview) dan jika demikian, hapus atau tambahkan jika tidak
pmerino
adalah [self popoverView]mengembalikan baru dibuat popover setiap kali? tidak dapat menambahkan tampilan "di atasnya" jika itu adalah tampilan yang sama, menambahkan tampilan yang sudah ada tanpa operasi. jika popoverViewmetode membuat yang baru setiap saat, maka metode itu tidak akan selalu ada dalam hierarki tampilan
bshirley
1
Satu pertimbangan penting yang membuat saya tersandung di sini: saat menghapus lalu menambahkan subview yang Anda pegang dengan properti IBOutlet (atau ivars) Anda perlu memastikan properti (ivars) kuat , atau (sebelum ARC) mereka tetap . Secara default, jika Anda ctrl-seret dari tampilan ke pengontrol untuk membuat stopkontak, ini akan membuatnya sebagai lemah karena mengasumsikan bahwa tampilan yang dibuat di ujung akan memilikinya sehingga Anda tidak memerlukan referensi yang kuat. Tetapi jika Anda kemudian menghapusnya secara terprogram, itu akan membatalkan alokasi kontrol dan mengatur referensi Anda ke nil (dalam ARC).
Rhubarb
18

Coba ini:

-(IBAction)showPopup:(id)sender
{
    if (!myView.superview)
        [self.view addSubview:myView];
    else
        [myView removeFromSuperview];
}
Mark Granoff
sumber
luar biasa! terkadang perlu myView.view.superview, tetapi berfungsi seperti ajaib bagi saya. Terima kasih @MarkGranoff
Lior Frenkel
11
    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }
Michael Frederick
sumber
Tidak berfungsi, cukup tambahkan tampilan di atasnya. Saya akan mengedit kode untuk menunjukkan kasus sebenarnya - zad0xsis 1 menit yang lalu edit
pmerino
12
@pmerino Selamat karena malasnya Anda juga menyalin "zad0xsis 1 menit lalu edit" :-)
Thomas Kekeisen
Saya pikir ini lebih mahal daripada solusi lain untuk jujur ​​karena harus mengulang melalui semua subview
SimplyKiwi
4

Persamaan Swift akan terlihat seperti ini:

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

Periksa superview dari subview ...

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

Kondisi if Anda harus berjalan seperti

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

}
Saran
sumber
Ini adalah sedikit modifikasi dari jawaban Michael Frederick. Apakah memberikan hasil yang berbeda dengan kode Vincent yang digunakan isDescendantOfView:?
paulmelnikow
Ini benar-benar memberikan hasil yang berbeda. Ini hanya memeriksa apakah itu pemandangan anak-anak, bukan cucu atau cicit, dll.
Sami Samhuri
0

Di sini kami menggunakan dua pandangan berbeda. Tampilan induk adalah tampilan di mana kita mencari tampilan keturunan dan memeriksa apakah ditambahkan ke tampilan induk atau tidak.

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
shubham
sumber