2011-12-28 44 views
6

我正在研究Xcode项目,一切都很顺利,直到我的两个类停止识别对方。下面是摘录:Xcode类不能“看到”另一个

#import "JBXViewController.h" 
@interface ViewController2 : UIViewController { 
    JBXViewController *jbx; 
} 

出于某种原因,我得到的错误“未知类型名‘JBXViewController’;你的意思‘的UIViewController’?”我不明白这是怎么可能的,因为我只是在上面几行输入其他类。任何见解都将非常感谢!

+0

你还在JBXViewController.h中导入ViewController2.h吗? – 2011-12-28 06:54:27

+0

必须有“JBXViewController.h”的sm问题。你可以发布JBXViewController类的一些初始代码吗? – samfisher 2011-12-28 06:54:36

+0

@FirozeLafeer:我在JBXViewController.h – Rob 2011-12-28 06:58:02

回答

11

当你说他们“看不到对方”时,我假设你的意思是你还在你的JBXViewController.h中导入了ViewController2.h。所以,你有一个头导入另一头,其中进口第一首部,其中进口第二,其中进口又是第一个......

相反,使用前向引用JBXViewController:

@class JBXViewController; 

@interface ViewController2 : UIViewController { 
    JBXViewController *jbx; 
} 

然后代替#import "JBXViewController.h"(在您的ViewController2.m中)

5

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中列出的方法。

总之,这些变化意味着三两件事:

  1. ViewController2不需要的JBXViewController如何工作的具体知识。这意味着您不再需要在ViewController2中导入JBXViewController.h。h,它解决了你眼前的问题。

  2. JBXViewController现在更加灵活。只要它在ViewController2中设置了适当的属性并实现了任何必要的委托方法,就可以在JBXViewController中更改任何你想要的,并且ViewController2永远不会知道或关心它。

  3. ViewController2现在更灵活了。您可以从应用程序的其他部分使用它,或将其移至其他应用程序。您可以在JBXViewController和ViewController2之间插入一个屏幕。

这些更改不需要让应用程序在您的设备上运行并按照您的打算运行。但是如果你开始采用这些设计,你将会有更轻松的时间。

+0

布伦特,我怀疑你是对的。感谢您提供详细的答案,我一定会重新考虑代码的结构。 – Rob 2011-12-30 22:22:22