iOS Dev, Как я могу вызвать метод в суперклассе моего UIViewController? - PullRequest
0 голосов
/ 19 июня 2011

У меня есть два UIViewController, например, A и B.

На A есть кнопка при нажатии загружает вид B как вспомогательный вид. Использование стандартного initWithNibName. На B есть кнопка, которая закрывает View B и должна вызывать метод в представлении A (его Parent View). Я думал, что это должен быть простой [super methoddName: периметр], но это не работает. после размещения NSLog, распечатавшего имя parentViewController, он вернул значение null, что является нечетным, поскольку, как правило, он должен вернуть представление A в качестве родительского представления.

Приветствия любых идей

Ответы [ 4 ]

0 голосов
/ 14 марта 2012

Самый простой способ сделать это, особенно если это статический метод:

ViewControllerB

#import "ViewControllerA.h"

- (void)dismissView{
    //implementation to close the view

    [ViewControllerA methodName:perimeter];
}

Удачи!

0 голосов
/ 19 июня 2011

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

A может установить свойство делегата на B при загрузке, но перед нажатиеми когда B нужно вызвать требуемый метод, он может просто вызвать его на объекте делегата.

Это делает связь между контроллерами более свободной, и если вы разрешаете делегату соответствовать протоколу,* * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * * * * * * * *1013* * * * * * * * * * * * *1013*
0 голосов
/ 19 июня 2011

parentViewController не будет работать, если вы добавите представление контроллера B как подпредставление. Вам нужно будет найти контроллер вида А другим способом.

Скажем, если вы добавили вид B как подпредставление, подобное этому,

[A.view addSubview:B.view];

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

[[B.view.superview nextResponder] methoddName:perimeter];

Если вы добавили B.view в качестве подпредставления где-то в иерархии представлений A.view.

UIResponder * responder = B.view.superview;
do {
    responder = [responder nextResponder];
} while ( ![responder isMemberOfClass:[A class]] );

// `responder` is referencing your view controller A. You will have to cast it.
0 голосов
/ 19 июня 2011

super относится к суперклассу вашего класса, а не к его родительскому контроллеру представления.

Способ быстро сделать это - создать новый метод init, который использует экземпляр контроллера представления A, используйте его для установки цели вашей кнопки.

Лучший способ - определить новый протокол на контроллере вида B. Сделать контроллер вида А соответствующим ему.При инициализации B передайте ссылку A для использования в качестве вашего делегата.Затем по нажатию кнопки в B вызовите нужный метод делегата.

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