88

Tôi đang tạo một ứng dụng trong đó tôi thêm một lượt xem addSubview:vào chế độ xem bằng cách sử dụng trên IBAction. Theo cách tương tự, khi nhấn nút đó IBActionlần nữa, nên gọi removeFromSuperviewvào phần 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];
    }

}
|
247

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

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

Bạn sẽ kết thúc với một mã như:

Mục tiêu-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()
    }
}
|
  • 1

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

    – Đỗ Lâm Uyên 18:47:37 14/09/2011
  • 1

    @ 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 thức (có thể là trường hợp lần đầu tiên), lần tiếp theo, bạn sẽ tiếp cận phần khác vì chế độ xem thứ hai bây giờ chế độ xem phụ của lần đầu tiên. Đó không phải là những gì bạn đã cố gắng để làm gì? Bạn có thể đang tìm kiếm một mecanism khác như điều khiển chế độ xem điều khiển?

    – Hồ Nam Phương 18:57:51 14/09/2011
  • 1

    tốt, popoverViewlà một khung nhìn phụ của rootView (rootViewControll). Tôi muốn kiểm tra xem nó có trên màn hình không (nếu nó có rootView dưới dạng giám sát) và nếu vậy hãy loại bỏ nó hoặc nếu không thì hãy thêm nó nếu không

    – Hồ Phúc Thịnh 19:09:25 14/09/2011
  • 1

    đang [self popoverView]trở lại một popover mới được tạo ra mỗi lần? nó không thể thêm chế độ xem "trên đó" nếu cùng chế độ xem, thêm chế độ xem đã có chế độ xem không. nếu popoverViewphương thức tạo một cái mới mỗi lần, thì nó sẽ luôn không nằm trong hệ thống phân cấp chế độ xem

    – Hoàng Bảo Anh 00:59:45 15/09/2011
  • 1

    Một cân nhắc quan trọng đã khiến tôi vấp ngã ở đây: khi xóa sau đó thêm các cuộc phỏng vấn mà bạn đang giữ bằng các thuộc tính IBOutlet (hoặc ngà), bạn cần đảm bảo các thuộc tính (ngà) mạnh hoặc (trước ARC) chúng vẫn được giữ lại . Theo mặc định, nếu bạn kéo ctrl từ chế độ xem sang bộ điều khiển để tạo ổ cắm, nó sẽ tạo ra điểm yếu vì nó giả định rằng chế độ xem được tạo trong ngòi sẽ sở hữu nó nên bạn không cần tham chiếu mạnh. Nhưng nếu sau đó bạn gỡ bỏ nó bằng lập trình, nó sẽ hủy điều khiển và đặt tham chiếu của bạn thành nil (trong ARC).

    – Võ Quỳnh Thư 17:24:04 01/11/2012
17

Thử đi:

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

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

    – Đỗ Lâm Uyên 05:41:43 21/09/2011
11
    UIView *subview = ...;
    if([self.view.subviews containsObject:subview]) {
        ...
    }
|
  • 1

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

    – Đỗ Lâm Uyên 18:50:04 14/09/2011
  • 1

    @pmerino Chúc mừng vì sự lười biếng đó mà bạn cũng đã sao chép "zad0xsis 1 phút trước chỉnh sửa" :-)

    – Hồ Nam Phương 15:09:49 26/01/2013
  • 1

    Tôi nghĩ rằng điều này đắt hơn các giải pháp khác phải trung thực bởi vì nó phải lặp đi lặp lại qua tất cả các

    – Hồ Phúc Thịnh 14:48:39 05/05/2016
2

Tương đương Swift sẽ trông giống như thế này:

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

Kiểm tra giám sát của cuộc phỏng vấn ...

-(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 nên đi

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

}
|
  • 1

    Đâ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?

    – Đỗ Lâm Uyên 02:59:27 15/09/2011
  • 1

    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 đó là chế độ xem trẻ em, không phải là cháu hay cháu chắt, v.v.

    – Hồ Nam Phương 01:41:35 30/07/2014

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.