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 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

回答

0

做到這一點的正確方法是委派。 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://stackoverflow.com/questions/5210535/passing-data-between-view-controllers)代理的速成課程, – FireSky 2013-05-02 00:42:20

1
的表達

假設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

相關問題