-performSelector:
このコンテキストで使用する理由はありません。MKMapView
オブジェクトの作成時にを初期化するメソッドを追加する場合は、if (self)
ブロック内からメソッドを呼び出します。
- (id)init
{
self = [super init];
if (self) {
[self setupMapView];
}
return self;
}
- (void)setupMapView
{
// THE CODE TO INITIALIZE MKMAPVIEW
}
2番目のメソッドを使用するか、メソッドのブロックに-setupMapView
セットアップ用のコードを残すか、から呼び出される2番目のメソッドにコードを分割するかは、個人的な好み/スタイルの問題です。MKMapView
if (self)
-init
-setupMapView
-init
そうは言っても、セットアップで他のことがうまくいかないようです。MKMapViewは[ほとんどの場合]UIViewController
サブクラス(おそらく関連付けられているXIB
)内にある必要があるため、にアクセスできます-viewDidLoad
。UIViewController
サブクラスがのデリゲートとして機能することに注意してくださいMKMapView
。
アップデート1
UIViewController
サブクラスインスタンスで(あなたがそれを呼んだと仮定します、あなたはオブジェクトにViewController
持っているべきIBOutlet
です。これは(1)インスタンス変数を追加することによってどちらかで行いますMKMapView
ViewController.h
@interface ViewController : UIViewController
{
IBOutlet MKMapView *myMap;
}
@end
または(2)プロパティを追加する
@interface ViewController : UIViewController
@property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap;
@end
ViewController.xib
これで、InterfaceBuilderで開きます。MKMapView
ビューの内側が必要です。まだ追加していない場合は、オブジェクトライブラリから追加します。を右クリックしFile's Owner
ます。アイテムのある行を見つけますmyMap
。行の右端の円からMKMapView
表示ビューのにドラッグします。
ViewController
これで、クラスにへの出口ができましたMKMapView
。MKMapView
ロードされた後、ViewControllerビューのサブビューにメッセージを送信できるようになります。
インスタンスが戻るSubClass
とすぐに破棄されないように、インスタンスのプロパティまたはインスタンス変数が必要です。-viewDidLoad
インスタンス変数をに追加することにより、これを再度実行しますViewController.h
@interface ViewController : UIViewController
{
IBOutlet MKMapView *myMap;
SubClass *istance;
}
@end
またはプロパティを追加することによって
@interface ViewController : UIViewController
@property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap;
@property (nonatomic, strong, readwrite) SubClass *istance;
@end
ここで、で、がのデリゲートとして設定されるようViewController.m
に定義する必要があります。コメントでは、独自の初期化子を作成することを提案しました。あなたがあなたのいくつかの大規模なセットアップをすることを計画しているなら、それは理にかなっています。の代理人になりたいだけの場合は、そのようなメソッドは必要ありません。 -viewDidLoad
self.istance
self.myMap
-initWithMapView:
SubClass
MKMapView
SubClass
MKMapView
両方の場合を考えてみましょう。
(1)方法を使用する-[SubClass initWithMapView:]
:
ViewController.m
あなたは(の内に@implementation
)ViewController
持っているでしょう
- (void)viewDidLoad
{
self.istance = [[SubClass alloc] initWithMapView:self.myMap];
}
SubClass.h
あなたは(の内に@interface
)SubClass
持っているでしょう
- (id)initWithMapView:(MKMapView *)mapView;
@property (nonatomic, weak, readwrite) MKMapView *mapView;
SubClass.m
あなたは(の内に@implementation
)SubClass
持っているでしょう
- (id)initWithMapView:(MKMapView *)mapView
{
self = [super init];
if (self) {
self.mapView = mapView;
self.mapView.delegate = self;
//more setup of mapView.
}
return self;
}
(2)使用-[SubClass init]
:
代わりに、ViewController.m
あなたは
- (void)viewDidLoad
{
self.istance = [[SubClass alloc] init];
self.myMap.delegate = self.istance;
}