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

Мне нужно отправить данные в родительский контроллер представления; поэтому (в родительском) я создал метод setLocWithName: loc: для этого. Как создать объект, который является родительским контроллером? Я пробовал parentViewController, а также presentingViewController (как показано ниже), но получаю предупреждение:

Несовместимые типы указателей, инициализирующие 'TDViewController *__strong' выражением типа 'UIViewController *'

// set object of parent view controller
TDViewController *tDViewController = [[self navigationController] presentingViewController];

// get data
NSArray *locs = [[PLStore sharedStore] allLocs];
PL *setselectedLoc = [locs objectAtIndex:[indexpath row]];

// send data to parent view controller 
[tDViewController setLocWithName:[setselectedLoc pLocName] loc:[setselectedLoc loc1]];

// Pop this view controller off the stack
[self.navigationController popViewControllerAnimated:YES];

person FireSky    schedule 01.05.2013    source источник
comment
Что вы имеете в виду под родителем? Вам нужно описать, какие контроллеры у вас есть, и как они соотносятся друг с другом.   -  person rdelmar    schedule 02.05.2013
comment
Я знаю это только как родительско-дочерние отношения, но у меня есть навигационный контроллер (я не уверен, что контроллер корневого представления нажат поверх него или как это работает, но я отвлекся). Тогда контроллер корневого представления - это родительский для TDViewcontroller (дочерний для корневого контроллера представления). TDViewController помещается поверх корневого контроллера представления, и этот PLViewController является дочерним по отношению к (или помещается в него) TDViewController.   -  person FireSky    schedule 02.05.2013
comment
Что ж, это неправильная терминология, контроллеры в навигационном стеке не имеют отношений родитель-потомок друг с другом (думаю, лучше рассматривать их как братьев и сестер). Итак, ваша структура: UINavigationController --> rootVC --> TDViewController --> PLViewController? В каком контроллере находится код, который вы разместили, PLViewController?   -  person rdelmar    schedule 02.05.2013
comment
Вы правы: RootVC нажимает TDVC сверху, затем нажимает на него PLCV. Данные и этот код находятся в PLVC, DTVC имеет метод setLocWithName loc и нуждается в данных.   -  person FireSky    schedule 02.05.2013


Ответы (2)


Правильный способ сделать это с делегированием. TDViewController должен сделать себя делегатом PLViewController, что вы должны сделать непосредственно перед отправкой в ​​PLViewController. PLViewController должен объявить протокол делегата с методом, который передает две части данных, которые вам нужны, обратно в TDViewController.

Однако, чтобы ответить на ваш фактический вопрос, вы можете получить ссылку на TDViewController, получив контроллер с индексом 1 в стеке навигации (в вашем конкретном случае). Это действительно не очень хороший способ сделать это, так как вы можете изменить порядок контроллеров, добавить или вычесть контроллеры, но вот как вы это сделаете:

TDViewController *tDViewController = (TDViewController *)[[self.navigationController viewControllers] objectAtIndex:1];
person rdelmar    schedule 01.05.2013
comment
Идеально! Это сработало как шарм, спасибо. Моих данных все еще нет, поэтому я посмотрю на делегат (я действительно их вообще не понимаю), но, по крайней мере, места в памяти совпадают. Что вы имели в виду в моем конкретном случае? Является ли 0 RootVC и 1 TDVC, что делает 2 PLVC? - person FireSky; 02.05.2013
comment
@user2340928 user2340928, да, 0 RootVC и 1 TDVC, что делает 2 PLVC, это то, что я имел в виду в вашем конкретном случае. - person rdelmar; 02.05.2013
comment
Хорошо, чем выше венчурный капитал в стеке, тем больше число. О, кстати, спасибо за совет делегата, у меня все заработало. Если кому-то, кто читает это, нужен ускоренный курс по делегатам, я использовал ссылку - person FireSky; 02.05.2013

Предполагая, что PresentingViewController (или parentViewController?) на самом деле имеет тип TDViewController, вам просто нужно выполнить приведение к первой строке:

TDViewController *tDViewController = (TDViewController *)[[self navigationController] presentingViewController];
person joshuahealy    schedule 01.05.2013
comment
Да, я пробовал это. Это тоже не сработало. означает ли это, что контроллер представления не является типом TDViewController? Я создал его, поэтому предполагаю, что это тип TDViewController. я должен использовать его родительский UIViewController? - person FireSky; 02.05.2013
comment
Вы должны попробовать отладить свой код, установить точку останова в этой строке и посмотреть, каковы фактические значения. - person joshuahealy; 02.05.2013
comment
Я так и сделал и отнес его к кому-то более опытному. Сначала я создавал TDViewController вместо выделения родителя. Таким образом, код будет работать до тех пор, пока я не вернусь к родителю, а информации там не будет. Теперь с parentViewController, а также с представлением ViewController в коде, tDViewController возвращает nil. - person FireSky; 02.05.2013
comment
Вы можете проверить тип с помощью isKindOfClass: или проверить, реагирует ли он на этот селектор с помощью respondsToSelector:, но согласившись с appclay на этот. - person iwasrobbed; 02.05.2013