Kiểm tra xem một lượt xem phụ có trong một lượt xem không


97

Tôi đang tạo một ứng dụng trong đó tôi thêm một chế độ xem phụ addSubview:vào một chế độ xem bằng cách sử dụng một IBAction. Theo cách tương tự, khi nút có nút đó IBActionđược chạm lại sẽ gọi removeFromSuperviewtrên lượt xem phụ đó được thêm vào đó IBAction:

MÃ 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];
    }

}

Câu trả lời:


271

Bạn có thể đang tìm kiếm UIView's -(BOOL)isDescendantOfView:(UIView *)view;được lấy trong tài liệu tham khảo lớp UIView .

Giá trị trả về CÓ nếu người nhận là chế độ xem phụ ngay lập tức hoặc ở xa hoặc nếu chế độ xem là chính người nhận; nếu không thì KHÔNG.

Bạn sẽ nhận được một mã như:

Objective-C

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

Swift 3

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

2
Không hoạt động, chỉ thêm chế độ xem qua nó. Tôi sẽ chỉnh sửa mã để hiển thị các trường hợp thực tế
pmerino

@ zad0xsis - Tôi không hiểu trường hợp thực tế. Nếu bạn đã thêm chế độ xem thứ hai bằng addSubview:phương pháp (có thể là trường hợp lần đầu tiên), thì lần sau, bạn sẽ đến phần khác vì chế độ xem thứ hai bây giờ chế độ xem phụ của chế độ xem thứ nhất. Đó không phải là những gì bạn đang cố gắng làm? Bạn có thể đang tìm kiếm một chủ nghĩa tôn giáo khác như lắp sẵn một bộ điều khiển chế độ xem?

tốt, popoverViewlà một chế độ xem phụ của rootView (rootViewController). Tôi muốn kiểm tra xem nó trên màn hình (nếu nó có rootView như SuperView) và nếu như vậy loại bỏ nó hoặc nếu không thêm nó nếu nó không
pmerino

được [self popoverView]trả lại một mới được tạo ra popover mỗi lần? nó không thể thêm một chế độ xem "qua nó" nếu đó là cùng một chế độ xem, việc thêm một chế độ xem đã có từ chối. nếu popoverViewphương pháp là tạo ra một cái mới mọi thời gian, sau đó nó sẽ luôn luôn không có trong giao diện hệ thống cấp bậc
bshirley

1
Một cân nhắc quan trọng khiến tôi gặp phải ở đây: khi xóa sau đó thêm các lượt xem phụ mà bạn đang giữ với các thuộc tính IBOutlet (hoặc ivars), bạn cần đảm bảo các thuộc tính (ivars) mạnh hoặc đó (trước ARC) mà chúng được giữ lại . Theo mặc định, nếu bạn ctrl-drag từ một chế độ xem sang một bộ điều khiển để tạo một lối ra, nó sẽ tạo ra nó là yếu vì nó giả định rằng chế độ xem được tạo trong nib sẽ sở hữu nó, vì vậy bạn không cần một tham chiếu mạnh. Nhưng nếu sau đó bạn xóa nó theo chương trình, nó sẽ phân bổ quyền kiểm soát và đặt tham chiếu của bạn thành nil (trong ARC).
Rhubarb

18

Thử cái này:

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

tuyệt vời! đôi khi nó cần myView.view.superview, nhưng nó hoạt động như một phép thuật đối với tôi. Cảm ơn @MarkGranoff
Lior Frenkel

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

Không hoạt động, chỉ thêm chế độ xem qua nó. Tôi sẽ chỉnh sửa mã để hiển thị các trường hợp thực tế - zad0xsis 1 phút trước chỉnh sửa
pmerino

12
@pmerino Congrats cho là lười biếng mà bạn cũng sao chép "zad0xsis 1 phút trước chỉnh sửa" :-)
Thomas Kekeisen

Thành thật mà nói thì tôi nghĩ điều này đắt hơn các giải pháp khác vì nó phải lặp đi lặp lại qua tất cả các lần xem phụ
SimplyKiwi

4

Swift tương đương sẽ trông giống như sau:

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

2

Kiểm tra superview của subview ...

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

1

Nếu điều kiện của bạn sẽ diễn ra như thế nào

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

}

Đây là một sửa đổi nhỏ trong câu trả lời của Michael Frederick. Nó có cho kết quả khác với mã của Vincent sử dụng isDescendantOfView:không?
paulmelnikow

Nó hoàn toàn mang lại một kết quả khác. Điều này chỉ kiểm tra nếu nó là một cái nhìn đứa trẻ, không phải là một đứa cháu hoặc cháu chắt vv
Sami Samhuri

0

Ở đây chúng tôi đã sử dụng hai quan điểm khác nhau. Chế độ xem gốc là chế độ xem trong đó chúng ta đang tìm kiếm chế độ xem con cháu và kiểm tra chế độ xem được thêm vào chế độ xem mẹ hay không.

if parentView.subviews.contains(descendantView) {
   // descendant view added to the parent view.
}else{
  // descendant view not added to the parent view.
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.