2013-10-19 95 views
0

我有这个项目名为engine.xcodeproj嵌入另一个项目myApp。Xcode和路径噩梦

该引擎必须从MainViewController.h中获取一个值,该值是应用程序类的头部,超出了engine.xcodeproj的范围。

如何让所有应用主路径对嵌入式项目可见!

我使用的Xcode 5和编译为iOS 6

我有这么回答此之前,但这些问题的答案都没有解决这种情况下...

见图片:

enter image description here

谢谢。

+1

你倒着做。通常,Xcode项目应该能够自己构建,而不需要外部依赖。如果您的'engine'项目依赖于外部'MyApp'项目中的头文件,那么它不能自行构建。为什么你使用单独的项目? –

+0

,因为这个想法是让这个引擎被多个应用程序使用。这是引擎必须访问主类的唯一情况。这一切都发生在用户退出使用模块并想要返回到主菜单时。 – SpaceDog

回答

4

呃,这就是所谓的意大利面代码。

最好在引擎项目中定义一个协议,视图控制器可以实现该协议,然后将id<Protocol>传递给引擎。这在两个项目之间创建了一个抽象,同时在它们之间定义了强大的语言(API)。您提到您希望在多个应用中使用Engine项目 - 这是您的最佳解决方案。

发动机项目:

@protocol MyAPIProtocol 

@required 

//Define here the actions you want to perform/get from the data source. 
- (CGFloat)floatValue; 
- (UITextView*)textView; 
- (void)displayAlertWithMessage:(NSString*)message; 

@end 

现在,你的火箭类应该有一个属性定义,像这样:

#import "MyAPIProtocol.h" 

@interface MainViewController() <MyAPIProtocol> 
@end 

@implementation MainViewController 

... 

//Implement the protocol 
- (CGFloat)floatValue 
{ 
    return 123.0f; 
} 

- (UITextView*)textView 
{ 
    return self.textView; 
} 

- (void)displayAlertWithMessage:(NSString*)message 
{ 
    //... 
} 

@end 

@property (nonatomic, weak) id<MyAPIProtocol> dataSource; //Whatever name you need, of course 
在你的应用程序使用该引擎项目

现在

结果是,引擎项目是独立的,不需要知道012的实现。它只知道它有一个dataSource属性可以满足所有需求。

现在,当你有你的引擎对象在MainViewController准备好了,你应该设置它的数据源:

self.engine.dataSource = self;

+0

我修正了协议定义。你有没有'#import'你定义协议的地方的.h文件?你应该在'MainViewController'中导入它。 –

+0

@橡皮桶不,不是黑魔法。你在协议中声明一个方法并在MainViewController中实现。不要忘记设置数据源:'engine.dataSource = self;'。现在,在引擎上,您只需调用'[self.dataSource objectIneed];'然后就可以执行了。 你为什么要删除你的评论? –

+0

我在哪里设置engine.dataSource = self; ?你不要在你的答案中提及它! – SpaceDog