iOS - принадлежит ли UIView к UIViewController? - PullRequest
7 голосов
/ 12 августа 2011

У меня есть несколько подвидов в моем ViewController.

В последнем слое у меня есть UIView, и из этого представления я хочу вызвать superview и идти вверх, пока не найду UIView, который принадлежит моему ViewController.принадлежит ли UIView к ViewController или нет?

UIView *someView = self.superView;

while (true)
{
   if (someView BELONGS TO VIEWCONTROLLER)
   {
      // Now we know this view belongs to a VIewController
      break;
   }

   someView = someView.superView;
}

Ответы [ 3 ]

9 голосов
/ 12 августа 2011

Если вы хотите узнать, находится ли определенное представление в иерархии, управляемой контроллером представления, и у вас есть указатель на контроллер представления:

BOOL belongsToController = [aView isDescendantOfView:viewController.view];

В качестве альтернативы, если вы хотите выяснить,определенное представление - это root иерархии, управляемой контроллером представления, но у вас нет указателя на контроллер представления, вы можете пройти по цепочке респондента.Согласно документации UIResponder nextResponder :

UIView реализует этот метод, возвращая объект UIViewController, который управляет им (если он есть), или егоsuperview (если это не так)

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

if ([[aView nextResponder] isKindOfClass:[UIViewController class]]) {
    // aView is the root of the view hierarchy managed by the view controller
}
4 голосов
/ 12 августа 2011

Подходы Влада и Альбертамга также верны. Однако вы также можете пройти цепочку респондента

  for (UIView* next = [self superview]; next; next = next.superview) {
    UIResponder* nextResponder = [next nextResponder];
    if ([nextResponder isKindOfClass:[UIViewController class]]) {
      UIViewController *theControllerThatYouWANT = (UIViewController*)nextResponder;
    }
  }
3 голосов
/ 12 августа 2011

попробуйте перейти в иерархию представлений и проверьте, совпадает ли текущий объект представления с представлением вашего контроллера

Код будет выглядеть примерно так: (написано в textEdit, здесь нет инструментов разработки, извините, если есть ошибки)

-(BOOL)view:(UIView *)aView belongsToController:(UIViewController *)viewController {
  BOOL belongsToController = NO;
  UIView *someView = [aView superView];
  while (someView != nil) {
    if (viewController.view == someView) {
        belongsToController = YES;
    }
    someView = [someView superView];
  }
  return belongsToController;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...