我正在尝试将名为“waitViewController”的第二个视图控制器中的数据发送回主ViewController。我使用的方法与我用来将数据从第一个发送到第二个的方法相反。问题是xcode不允许我在waitViewController.h中使用ViewController,而是希望我编写UIViewController。我该如何解决? 我想要的是: 它给我的错误:
答案 0 :(得分:1)
您可能需要使用'@class'代替'#import ViewController.h'
所以用以下代码替换import语句:
@class ViewController;
如果两个类的定义相互依赖,则需要这样做,因为您的两个视图控制器类似乎都是这样。
如果您最终使用@class,则必须在实现文件中导入“ViewController.h”。 @class防止无限循环(否则)相互依赖的类定义。据我了解,@ class表示“这个类”SomeClass“存在,所以不要担心它,即使我还没有导入它的接口。”
顺便说一下,我觉得我应该提到@class是一个黑客,还有另一个更优雅的解决方案:一个(正式或非正式)协议。要使用正式协议:将协议定义放在'WaitViewController.h'的顶部:
@protocol WaitControllerDelegate
-(void) useThisNewData: (NSWhateverDataType *) theData;
- (void) useThisOtherData:(SomeOtherDataType) otherData;
@end
在WaitViewController界面中,不要将'turnData'定义为'ViewController *'类型。而是将其定义为“id”类型:
@property (nonatomic, assign) id <WaitControllerDelegate> turnDataDelegate;
(请注意,假设ViewController拥有对WaitViewController的'retain'引用并且您不希望两个对象具有强引用,他们会使用'assign'而不是'retain' - 它们将创建'保留循环',即互不允许彼此解除分配。) 在WaitViewController实现文件中,每当需要发回数据时,请调用
[turnDataDelegate useThisNewData: someData];
在ViewController.h中,宣布您正在采用'WaitControllerDelegate'协议:
@interface ViewController : UIViewController <WaitControllerDelegate> {
然后,在ViewController.m中实现'WaitControllerDelegate'方法,就像你可以使用任何其他方法一样,但是你不必在接口中声明它们:
- (void) useThisNewData: (NSWhateverDataType *) theData {
...do whatever you want
}
这种方法涉及更多的工作,但更好,因为它允许'WaitViewController'类更自包含,并且通常,理论上,使您的类更可重用。