我正在尝试创建一个应用程序(使用故事板),我想用事件填充它。 在我的MapViewController.h中,我有:
#imports
extern NSMutableArray* events;
@interface MapViewController : etc, etc{
..
}
所以我想要的是能够导入这个.h文件,例如我的AppDelegate.m文件,并在appDidFinishLoading中执行以下操作:
Event *event = [[Event alloc] init];
event.blabla = blabla;
...
[events addObject:event];
同时在我的MapViewController.m中我想要一个将这些事件添加到我的MKMapView(在我的mapviewcontroller中定义并称为worldView)的函数
这样:
@implementation MapViewController.m
-(void)setEvents{
for(int i = 0; i<[events count]; i++)
[worldView addAnnotation:[events objectAtIndex:i]];
}
...
正如您可能已经猜到的那样,在构建的链接部分出现以下错误时失败:
Undefined symbols for architecture armv7:
"_events", referenced from:
-[AppDelegate applicationdidFini... ]
-[MapViewController setEVents] in ...
..
clang: error: linker command failed with exit code 1 (use -v to see invocation)
所以..是的..请帮助^^
答案 0 :(得分:0)
永远不要将全局变量用于这样的目的,它们是邪恶的。
更好地使用单例(即所谓的设计模式)方法创建类似“管理器”(例如EventManager类)的东西,以在独立控制器之间共享数据。
答案 1 :(得分:0)
有更好的模式,例如yan.kun提到的单例模式,但是你要做的就是将这行放在你的@implementation
之外的AppDelegate.m中:
NSMutableArray* events;
这为它提供了一个全局空间,因此您不会收到链接器错误。然后,您需要在使用它的任何各种类之前初始化事件数组 。强有力地解决这个初始化问题是其他模式更好的原因之一。在你的情况下,你可以在你的AppDelegate中尽早完成这项工作,并完成启动方法。
P.S。如果必须使用全局变量,则不要将它们命名为“事件”,因为名称冲突的可能性非常高。