#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.