Xcode类不能彼此"看到"

Rob*_*Rob 6 class objective-c

我正在开发一个Xcode项目,一切都很顺利,直到我的两个课程停止相互认识.这是一段摘录:

#import "JBXViewController.h"
@interface ViewController2 : UIViewController {
    JBXViewController *jbx;
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,我得到错误"未知类型名称'JBXViewController';你的意思是'UIViewController'?" 我不明白这是怎么可能的,因为我正在导入其他类只是几行.任何见解将不胜感激!

Fir*_*eer 11

当你说他们"看不到对方"时,我认为你的意思是你也在你的JBXViewController.h中导入ViewController2.h.所以你有一个标题导入另一个标题,导入第一个标题,导入第二个标题,再次导入第一个标题...

相反,使用JBXViewController的前向引用:

@class JBXViewController;

@interface ViewController2 : UIViewController {
    JBXViewController *jbx;
}
Run Code Online (Sandbox Code Playgroud)

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


Bre*_*don 5

Firoze Lafeer的回答是正确的,但这个问题可能是代码设计不佳的一个症状.

我假设,在你的应用程序中,JBXViewController是一个父视图控制器,它有时会显示某个特定函数的ViewController2.(例如,JBXViewController显示记录列表,而ViewController2编辑其中一条记录.)在这种情况下,ViewController2不应该知道JBXViewController的细节.相反,JBXViewController应该通过ViewController2的属性为ViewController2提供所需的数据,如果ViewController2必须调用JBXViewController上的方法,它们应该是委托协议的一部分.

例如,假设JBXViewController当前具有以下属性,并且ViewController2访问它:

@property (strong) JBXObject * currentObject;
Run Code Online (Sandbox Code Playgroud)

你应该在ViewController2上有一个currentObject属性,JBXViewController应该在显示视图控制器之前设置它:

self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
Run Code Online (Sandbox Code Playgroud)

这适用于单向通信-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
Run Code Online (Sandbox Code Playgroud)

然后让JBXViewController符合协议:

@interface JBXViewController : UIViewController <ViewController2Delegate>
Run Code Online (Sandbox Code Playgroud)

在Interface Builder中或在代码中设置委托:

self.myViewController2.delegate = self;
self.myViewController2.currentObject = self.currentObject;
[self.navigationController pushViewController:self.myViewController2 animated:YES];
Run Code Online (Sandbox Code Playgroud)

并实现ViewController2Delegate中列出的所有方法.

这些变化共同意味着三件事:

  1. ViewController2不需要具体了解JBXViewController的工作原理.这意味着您不再需要在ViewController2.h中导入JBXViewController.h,这可以解决您的直接问题.

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

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

这些更改不是使应用程序在您的设备上运行并按照您的意图运行所必需的.但如果你开始采用这些设计,你将会有更轻松的时间.