Вызывающий метод в родительском UIViewController, после добавления с помощью addSubview

#iphone #ios #uiviewcontroller #parent #addsubview

#iPhone #iOS #uiviewcontroller #родительский #addsubview

Вопрос:

У меня есть UIViewController, который создает другой контроллер представления и добавляет его представление в качестве подвида:

В родительском UIViewController:

 SlateMoreView* subView = [[SlateMoreView alloc] initWithNibName:@"SlateMoreView" bundle:nil];
[self.view addSubview:subView.view];
  

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

Я видел, как это сделать, когда я добавляю вспомогательный UIViewController, используя [self.NavigationController pushViewController: subView animated: YES], потому что я могу найти родительский элемент, используя этот код:

Во вложенном представлении UIViewController:

 NSArray* viewControllerArray = [self.navigationController viewControllers]
int parentViewControllerIndex = [viewControllerArray count] - 2;
SlateView* slateView = [viewControllerArray objectAtIndex:parentViewControllerIndex];
  

… и тогда я могу отправлять ему сообщения. Но поскольку я добавил дополнительный вид вручную с помощью addSubview, я не могу этого сделать.

Кто-нибудь может подумать о том, как я могу поговорить с моим родительским UIViewController?

Спасибо!

Ответ №1:

UIView у них есть superview свойство, которое, похоже, является тем, что вы ищете.

Кроме того, вы, вероятно, не захотите использовать такое представление nest UIViewController , если только вы не намеренно создаете пользовательский contain view controller. Смотрите http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers /

Комментарии:

1. Прочитайте эту статью. Очень информативно, спасибо. Причина, по которой я решил сделать это таким образом, заключается в том, что это меньший вид, который перемещается поверх родительского вида. Должен ли я изучать материал контроллера модального представления, как вы думаете?

2. Представление контроллера представления как модального не даст вам контроля над его положением или позволит вам изменить его ожидаемый размер. Я думаю, что вы, вероятно, захотите это сделать либо: 1. Просто создайте представление без выделенного контроллера, добавьте его в качестве подвида и управляйте им по мере необходимости с помощью вашего существующего контроллера. или 2. Создайте представление с некоторым пользовательским контроллером, отвечающим за управление его поведением. Пусть этот контроллер расширяет NSObject, а не UIViewController, чтобы у вас не было неправильного предположения, что он может вести себя как обычно UIViewController.

Ответ №2:

Возможно, вы захотите подумать, можно ли решить вашу проблему с помощью NSNotifications. Вы могли бы опубликовать уведомление из своего подпросмотра, когда происходит событие, о котором должны знать заинтересованные слушатели (ваш супервизор). Когда superview получает уведомление, он может запускать любой код, который вы пожелаете. Все это время подвиду никогда не нужно знать о супервизоре.

Это один из способов сделать ваши классы менее зависимыми друг от друга.

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

Ответ №3:

Когда вы добавляете свое представление в качестве подвида в иерархию представлений, вы помещаете его в цепочку ответчиков. Вы можете подняться по цепочке ответчиков, чтобы добраться до контроллера представления, поскольку a, UIView контролируемый a UIViewController , имеет UIViewController в качестве nextResponder своего.

 id object = theSubview;
do {
    object = [object nextResponder];
} while ( ![object isMemberOfClass:[YourViewController class]] );

// object has the view controller you need.