-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番目のメソッドにコードを分割するかは、個人的な好み/スタイルの問題です。MKMapViewif (self)-init-setupMapView-init
そうは言っても、セットアップで他のことがうまくいかないようです。MKMapViewは[ほとんどの場合]UIViewControllerサブクラス(おそらく関連付けられているXIB)内にある必要があるため、にアクセスできます-viewDidLoad。UIViewControllerサブクラスがのデリゲートとして機能することに注意してくださいMKMapView。
アップデート1
UIViewControllerサブクラスインスタンスで(あなたがそれを呼んだと仮定します、あなたはオブジェクトにViewController持っているべきIBOutletです。これは(1)インスタンス変数を追加することによってどちらかで行いますMKMapViewViewController.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に定義する必要があります。コメントでは、独自の初期化子を作成することを提案しました。あなたがあなたのいくつかの大規模なセットアップをすることを計画しているなら、それは理にかなっています。の代理人になりたいだけの場合は、そのようなメソッドは必要ありません。 -viewDidLoadself.istanceself.myMap-initWithMapView:SubClassMKMapViewSubClassMKMapView
両方の場合を考えてみましょう。
(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;
}