Как проверить, является ли UIView подпредставлением родительского представления - PullRequest
12 голосов
/ 16 октября 2011

У меня есть приложение, к которому я добавляю подпредставление (и удаляю то же подпредставление на основе взаимодействия с пользователем). Я ищу способ проверить, присутствует ли подпредставление или нет в любой момент времени.

Например:

В текущем представлении (UIView *viewA) я добавляю подпредставление (UIView *viewB). Затем я хочу проверить способ отображения viewB в любой момент времени.

Извините, если это не очень понятно, это довольно сложно описать.

Ответы [ 4 ]

42 голосов
/ 16 октября 2011

an UIView хранит свое суперпредставление и доступно с superview -property просто попробуйте

if([viewB superview]!=nil)
    NSLog(@"visible");
else
    NSLog(@"not visible");

Но лучше использовать hidden -свойство из UIView

13 голосов
/ 04 августа 2015

Я прошел через ту же проблему и обратился к Документация Apple и придумал это элегантное решение:

if([self.childView isDescendantOfView:self.parentView])
{
    // The childView is contained in the parentView.
}
2 голосов
/ 17 октября 2011

Вот метод, который я добавил в appDelegate, чтобы я мог отобразить всю иерархию подпредставлений из любой точки.

// useful debugging method - send it a view and it will log all subviews
// can be called from the debugger
- (void) viewAllSubviews:(UIView *) topView Indent:(NSString *) indent  {
    for (UIView * theView in [topView subviews]){
        NSLog(@"%@%@", indent, theView);
        if ([theView subviews] != nil)
            [self viewAllSubviews:theView Indent: [NSString stringWithFormat:@"%@ ",indent]];
    }
}

вызовите его со строкой из одного символа, и он будет иметь отступ для вас.(т.е. [appDelegate viewAllSubviews:self.view Indent:@" "];)

Я считаю полезным сначала очистить панель отладки, затем вызвать ее из отладчика и скопировать в текстовый редактор, такой как BBEdit, который покажет отступы.

Вы можете вызвать его, используя вид главного окна, и увидеть все на экране.

0 голосов
/ 22 марта 2018

Я обновился до Swift4, большое спасибо @Shinnyx и @ thomas.

if viewB.superview != nil{     
    print("visible")
}
else{
   print("not visible")
}

if selfView.isDescendant(of: self.parentView) {
    print("visible")
}
else{
    print("not visible")
}

func isDescendant (из: UIView)

Возвращаетлогическое значение, указывающее, является ли получатель подпредставлением данного представления или идентично этому представлению.

...