2011-11-08 54 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

相关问题