0

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

Несовместимые типы указателей инициализации «TDViewController * __ сильный» с выражением типа "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]; 
+0

Что вы подразумеваете под «родителем»? Вам нужно описать, какие контроллеры у вас есть, и как они соотносятся друг с другом. – rdelmar

+0

Я знаю только как родительское дочерние отношения, но у меня есть навигационный контроллер (я не уверен, что контроллер корневого представления нажимает поверх этого или как это работает, но я отвлекаюсь.) Затем контроллер корневого представления родительский элемент для TDViewcontroller («дочерний» к контроллеру корневого представления). TDViewController помещается в конец контроллера корневого представления, и этот PLViewController является «дочерним» для TDViewController. – FireSky

+0

. Ну, это не правильная терминология. Контроллеры в стеке навигации не имеют отношения родитель-потомок с друг друга (лучше подумать о братьях и сестрах, я думаю). Итак, ваша структура: UINavigationController -> rootVC -> TDViewController -> PLViewController? Какой контроллер - код, который вы отправили, PLViewController? – rdelmar

ответ

0

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

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

TDViewController *tDViewController = (TDViewController *)[[self.navigationController viewControllers] objectAtIndex:1]; 
+0

Отлично! Спасибо, спасибо. Мои данные все еще не найдены, поэтому я рассмотрю вопрос о делетете (я вообще этого не понимаю), но по крайней мере совпадают места памяти. Что вы имели в виду «в моем конкретном случае»? Есть 0 RootVC и 1 TDVC, делающий 2 PLVC? – FireSky

+0

@ user2340928, да, 0 RootVC и 1 TDVC, делающий 2, PLVC - это то, что я имел в виду под вашим конкретным случаем. – rdelmar

+0

Приятно, что чем выше VC находится в стеке, тем больше число. О, спасибо, спасибо за отзыв делегата. Я получил его работу.Если кто-либо читает это, нужен краш-курс для делегатов, я использовал [link] (http://stackoverflow.com/questions/5210535/passing-data-between-view-controllers) – FireSky

1

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

TDViewController *tDViewController = (TDViewController *)[[self navigationController] presentingViewController]; 
+0

Да, я пробовал это. Это тоже не сработало. означает ли это, что контроллер вида не является типом TDViewController? Я создал его, поэтому я предполагаю, что это тип TDViewController. должен ли я использовать его родительский UIViewController? – FireSky

+0

Вы должны попробовать отладить свой код, установить точку останова на этой строке и посмотреть, что представляют собой фактические значения. – joshuahealy

+0

Я сделал это, и я взял его для кого-то более опытного. Сначала я создавал TDViewController вместо выделения родителя. Таким образом, код будет работать до тех пор, пока я не вернусь к родителям, и информации там не было. Теперь с parentViewController, а также с представлениемViewController в коде tDViewController возвращает нуль. – FireSky

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