2014-02-19 4 views
0

В моем UIViewController A у меня есть вид контейнера, который загружает некоторые другие UIViewController B. Я хочу, чтобы UIViewController A сможет узнать, что происходит в его собственном контейнере.Получение данных из вида контейнера

Проблема в том, что я не могу получить доступ из контейнера, к виду, которое в нем. Например, в контейнере есть контроллер вида с textfield, и я хочу, чтобы viewA узнал, когда кто-то начал вводить текст.

Я должен использовать delegates, или есть способ получить данные из вида контейнера?

+0

Что такое "Контейнер", что вы зовете? self.view за UIViewController? То, что очевидно, не обязательно очевидно для других, по крайней мере, не для таких идиотов, как я. –

+0

MVC. Изменения в текстовом поле должны храниться где-то в каком-то классе модели (возможно, в глобальном масштабе). Контроллер представления управляет этим входом, и как только он находится в модели, вы можете видеть ее повсюду. – trojanfoe

+0

@trojanfoe это не ответ. Я знаю, как делиться данными. Мне нужен какой-то делегат, я хочу сообщить родительскому представлению о чем-то, что только что произошло. l Помидор, вы не идиот. Да, что вы сказали, правда, его контейнерный вид, с которым я иду с self.view. – Curnelious

ответ

1

Ребенок UIViewController can access it's parent with parentViewController` и использовать его для отправки сообщений родителям. Вы можете сделать это напрямую, но ...

В зависимости от уровня взаимодействия лучше всего создать интерфейс, который реализует родительский UIViewController. Когда дочерний элемент UIViewController добавляется к родительскому объекту, он получает ссылку на объект, реализующий интерфейс. Он обеспечивает сильное взаимодействие между объектами, но также поддерживает правильную инкапсуляцию, и это шаблон делегата.

Итак, мой ответ: вам не нужно использовать шаблон делегата, но он кажется подходящим решением. Если вы не используете шаблон делегата, вы можете оказаться с парой объектов, которые так сильно связаны, вы могли бы просто сделать это одним объектом.

// Somewhere in your view controller A you want to add B as a child 
B *b = [[B alloc] init]; // create view controller B 
b.delegate = self;  // set up A as the delegate to B 

// Add B as child 
[self addChildViewController:b]; 
[self.containerView addSubview:b.view]; 

Когда B добавляется в детстве A делегат получает набор. Предполагая, что A реализует интерфейс, B будет обладать таким свойством, как @property (weak, nonatomic) id<MySomethingDelegate> delegate;. B должен иметь возможность вызвать любой метод делегата в любой точке.

+0

Спасибо. Прежде всего, я не могу добавить делегата-получателя в экземпляр контроллера представления, потому что UIViewcontroller * sv, чем не разрешил бы [sv setDelegate: self]. ВТОРОЙ, в отношении вашего последнего варианта, можете ли вы показать мне какое-то направление? я не мог понять, что вы имеете в виду. – Curnelious

+0

вы не можете этого сделать. если я делаю B * b вместо UIViewcontroller * b, это не позволит мне добавить его в качестве дочернего ... – Curnelious

+0

'B' должен быть подклассом' UIViewController'. – DBD

Смежные вопросы