Firoze Lafeer的回答是正确的,但是这个问题可能是代码中糟糕设计的一个症状。
我认为,在您的应用程序中,JBXViewController是父视图控制器,它有时会为某些特定功能显示ViewController2。 (例如,JBXViewController显示记录列表,而ViewController2编辑其中一个记录。)在这种情况下,ViewController2不应该知道JBXViewController的细节。相反,JBXViewController应该通过ViewController2的属性为ViewController2提供它需要的数据,如果ViewController2必须在JBXViewController上调用方法,它们应该是委托协议的一部分。
例如,假设JBXViewController目前有以下属性,ViewController2访问它:
@property (strong) JBXObject * currentObject;
而应该有ViewController2一个currentObject属性,JBXViewController显示视图控制器前,应设置:
self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
这适用于单向通信 - JBXViewController可以给ViewController2数据。如果数据需要返回到JBXViewController(除了通过更改currentObject的属性),您应该为ViewController2设置一个委托。例如:
@protocol ViewController2Delegate; // forward declaration
@interface ViewController2 : UIViewController
@property (weak) id <ViewController2Delegate> delegate;
...
@end
@protocol ViewController2Delegate <NSObject>
- (void)viewController2ShouldSave:(ViewController2*)viewController2;
- (BOOL)viewController2:(ViewController2*)viewController2 shouldAddSomoflange:(JBXSomoflange*)aSomoflange;
@end
然后让JBXViewController符合协议:
@interface JBXViewController : UIViewController <ViewController2Delegate>
设置委托,无论是在界面生成器或代码如下所示:
self.myViewController2.delegate = self;
self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
而且全部落实在ViewController2Delegate中列出的方法。
总之,这些变化意味着三两件事:
ViewController2不需要的JBXViewController如何工作的具体知识。这意味着您不再需要在ViewController2中导入JBXViewController.h。h,它解决了你眼前的问题。
JBXViewController现在更加灵活。只要它在ViewController2中设置了适当的属性并实现了任何必要的委托方法,就可以在JBXViewController中更改任何你想要的,并且ViewController2永远不会知道或关心它。
ViewController2现在更灵活了。您可以从应用程序的其他部分使用它,或将其移至其他应用程序。您可以在JBXViewController和ViewController2之间插入一个屏幕。
这些更改不需要让应用程序在您的设备上运行并按照您的打算运行。但是如果你开始采用这些设计,你将会有更轻松的时间。
你还在JBXViewController.h中导入ViewController2.h吗? – 2011-12-28 06:54:27
必须有“JBXViewController.h”的sm问题。你可以发布JBXViewController类的一些初始代码吗? – samfisher 2011-12-28 06:54:36
@FirozeLafeer:我在JBXViewController.h – Rob 2011-12-28 06:58:02