0

(ストーリーボードを使用して)アプリを作成しようとしていますが、イベントを追加したいと思います。私の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)

だから..うん..助けてください^^

4

2 に答える 2

0

yan.kun によって言及されたシングルトン パターンなどのより良いパターンがありますが、あなたがやろうとしていることを行う方法は、この行を AppDelegate.m の外側に置くことです@implementation:

NSMutableArray* events;

これによりグローバル スペースが提供されるため、リンカー エラーは発生しません。次に、イベント配列を使用するさまざまなクラスがそれを必要とする前に、その配列を初期化する必要があります。この初期化の問題を確実に解決できることが、他のパターンの方がはるかに優れている理由の 1 つです。あなたの場合、おそらく AppDelegate の起動メソッドの早い段階でこれを行うことで逃げることができます。

PS グローバル変数を使用する必要がある場合は、名前が衝突する可能性が非常に高いため、「イベント」などの一般的な名前を付けないでください。

于 2012-07-16T11:09:22.333 に答える
0

そのような目的でグローバル変数を決して使用しないでください。それらは悪です。

シングルトン (いわゆるデザイン パターン) ベースのアプローチを使用して、「マネージャー」のようなもの (EventManager クラスなど) を作成し、独立したコントローラー間でデータを共有することをお勧めします。

于 2012-07-16T09:34:54.043 に答える