调用父视图控制器(通过导航控制器)

目前我使用pushViewController:animated:添加一个viewcontroller pushViewController:animated:现在从那个新的一个想要在我的“父母”控制器内调用一个方法。 我想我被困在navigationcontroller。

目前试图看看是否是我想要的控制器:

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

这两个都没有工作。

如何访问推送当前控制器的控制器(一种方法)?

就像马森提到的,你需要使用委托…

这是一个示例:

在您的子视图控制器.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 } 
 self.navigationController.viewControllers 

返回导航堆栈中所有视图控制器的数组。 当前视图控制器位于堆栈的顶部,前一个视图控制器是下一个视图控制器,依此类推。

所以,你可以做到以下几点:

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

如果你知道以前的控制器是什么类的,你可以使用id而不是id。

不确定你的应用程序逻辑,但你总是可以做到这一点。

在你的“孩子”控制器中,声明父types控制器的属性。 所以,在你的.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]; 

我不会主张这种编码方式,但它是一种快速/廉价/肮脏的方式来完成的事情。