2011-11-08 185 views
6

目前我添加一個使用pushViewController:animated:的視圖控制器,現在從那個新的控制器中想調用我的「父」控制器中的一個方法。我想我被卡在導航控制器中。調用父視圖控制器(通過導航控制器)

目前正在這看它是否是我想要控制器:

if([self.superclass isKindOfClass:[MySuperController class]]) 
// and tried: 
if([self.presentingViewController isKindOfClass:[MySuperController class]]) 

這兩個都沒有工作。

如何訪問推送當前控制器的控制器(一種方法)?

+0

您應該在第二個視圖控制器上聲明一個委託並在「ParentViewController」 – Marsson

+0

@Marsson上實現它們,看起來如何? ''然後...? – LouwHopley

回答

37

就像Marsson提到的,你需要使用代理...

下面是一個例子:

在你的孩子的視圖控制器的.h文件:

@protocol ChildViewControllerDelegate <NSObject> 
- (void)parentMethodThatChildCanCall; 
@end 

@interface ChildViewController : UIViewController 
{ 
} 
@property (assign) id <ChildViewControllerDelegate> delegate; 

在你的子視圖控制器.m文件:

@implementation ChildViewController 
@synthesize delegate; 


// to call parent method: 
// [self.delegate parentMethodThatChildCanCall]; 

在父視圖控制器中.h文件:

@interface parentViewController <ChildViewControllerDelegate> 

在父視圖控制器.m文件:

//after create instant of your ChildViewController 
childViewController.delegate = self; 

- (void) parentMethodThatChildCanCall 
{ 
    //do thing 
} 
+0

耶!謝謝:D - 我使用'[self.delegate myMethod]在小孩中調用方法;' – LouwHopley

+0

我一直在努力爭取這一整天,直到找到答案。忘了將childviewcontroller委託設置爲self。感謝你的回答 :-)。 –

+0

感謝您的支持!工作就像一個魅力.. –

1

不確定您的應用程序邏輯,但您始終可以執行此操作。

在您的「孩子」控制器中,聲明類型父控制器的屬性。所以,在您的.h文件中:

MySuperController *superController; 
property(nonatomic, retain)MysuperController *superController; 

,並在您.m文件:

@synthesize superController; 

之前 「推」 你的孩子控制器:

MyChildController *child = ... 
[child setSuperController:self]; 
[self.navigationController pushViewController:child animated:YES]; 

然後在你的孩子,你控制器可以簡單地訪問你的超級與

[this.superController myMethod:param]; 

我'我不會主張這種編碼方式,但它是一種快速/廉價/骯髒的方式來完成事情。

+0

很酷,謝謝。正當我嘗試'[child setSuperController:self];'它警告我試圖發送'MySuperController *'而不是'int *'......奇怪? – LouwHopley

+0

啊,不能這樣做。它創造無限循環。 (與他們相互導入) – LouwHopley

+0

請參閱user523234的答案 - 他更重要。 –

4
self.navigationController.viewControllers 

返回導航堆棧中所有視圖控制器的陣列。當前視圖控制器位於堆棧的頂部,前一個視圖控制器是下一個視圖控制器,依此類推。如果你知道前面的控制器是什麼類,你可以明確地投它,而不是使用ID

NSArray *viewControllers =  self.navigationController.viewControllers; 
int count = [viewControllers count]; 
id previousController = [viewControllers objectAtIndex:count - 2]; 
if ([previousController respondsToSelector:@selector(myMethod)]) 
    [previousController myMethod]; 

所以,你可以做以下。

+0

似乎是一種合法的方式,但是,當我'NSLog'它時'count'是'0'。 – LouwHopley

+0

這將建議導航控制器爲零,我確實假設您使用導航控制器的問題,是不是? – jrturton

相關問題