如何将父视图控制器设置为对象,以便我可以调用其中一个方法?

问题描述:

我需要发送数据到父视图控制器;所以(在父母)我创建了一个方法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 2013-05-01 22:42:56

+0

我只知道它作为父子关系,但我有一个导航控制器(我不确定是否根视图的控制器是推在上面,或者如何工作,但我离题了)。然后根视图控制器是TDViewcontroller的父级(“子级”到根视图控制器)。 TDViewController被推到根视图控制器的ontop上,并且这个PLViewController是TDViewController的“子”(或者被推入)TD38Controller – FireSky 2013-05-01 22:57:47

+0

好吧,这不是正确的术语,导航栈上的控制器没有父子关系彼此(更好地认为我是兄弟姐妹)。所以,你的结构是:UINavigationController - > rootVC - > TDViewController - > PLViewController?哪个控制器是您发布的代码,PLViewController? – rdelmar 2013-05-01 23:20:25

做到这一点的正确方法是委派。 TDViewController需要使自己成为PLViewController的代理,您应该在推送到PLViewController之前执行该代理。 PLViewController应该使用一个方法来声明一个委托协议,以便在TDViewController中传递您需要的两部分数据。

要回答您的实际问题,您可以通过在导航堆栈上的索引1处获取对TDViewController的引用(在特定情况下)。这实际上不是一个好办法,因为你可能会改变控制器的顺序,或者增加或减少控制器,但这是你的方式:

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

完美!这就像一个魅力,谢谢。我的数据仍然不存在,所以我会考虑委托的事情(我真的不明白这些),但至少内存位置匹配。你的意思是“在我的个案中”?是0的RootVC和1的TDVC制造2 PLVC? – FireSky 2013-05-01 23:44:07

+0

@ user2340928,是的,0 RootVC和1 TDVC制作2 PLVC就是我所说的你的特殊情况。 – rdelmar 2013-05-02 00:28:14

+0

不错,堆栈上的VC越高,数字越大。哦,顺便说一句,谢谢代表的提示,我得到了它的工作。如果有人阅读这篇文章需要关于我使用[link](http://*.com/questions/5210535/passing-data-between-view-controllers)代理的速成课程, – FireSky 2013-05-02 00:42:20

的表达

假设presentingViewController(?或parentViewController)是类型TDViewController实际上,您需要做的仅仅是在第一线铸造:

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

是的,我试过了。它也没有工作。这是否意味着视图控制器不是TDViewController类型?我创建它,所以我假设它是TDViewController类型。我应该使用它的父UIViewController? – FireSky 2013-05-01 22:25:53

+0

您应该尝试调试您的代码,在该行上设置断点并查看实际值。 – joshuahealy 2013-05-01 22:29:01

+0

我做了,我把它交给了更有经验的人。首先,我创建了TDViewController,而不是分配父级。因此,代码将工作,直到我弹回到父母和信息不存在。现在使用parentViewController以及在代码中呈现ViewController,tDViewController返回一个零。 – FireSky 2013-05-01 22:35:03