Как проверить, является ли UIView подзором родительского представления

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

Например:

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

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

Ответ 1

UIView сохраняет свою SuperView и доступно с superview -property просто попробовать

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

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

Ответ 2

Я прошел ту же самую проблему и посоветовался с Apple Documentation и придумал это элегантное решение:

if([self.childView isDescendantOfView:self.parentView])
{
    // The childView is contained in the parentView.
}

Ответ 3

Здесь метод, который я помещал в 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, который отобразит отступы.

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

Ответ 4

Я обновился до 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)

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