0

NSObjectのサブクラスがあり、IMMEDIATELY(一種の-(void)viewDidLoad)メソッド(この場合はMkMapViewをロードする)を呼び出します。これを行うためのより良い方法は何ですか?viewDidLoadを使用できないと思うので、performSelectorを使用できますか?

SubClass.h

@interface Mysubclass : NSObject <MKMapViewDelegate> {
}

SubClass.m(最初の選択肢)

-(id)init{
 self = [super init];
 if ( self != nil ) {
 // THE CODE TO INITIALIZE MKMAPVIEW
}
return self
}

またはSubClass.m(2番目の選択肢)

-(id)init{
 [self performSelector:@selector(myMethod)];
 return self;
}

-myMethod{
 // THE CODE TO INITIALIZE MKMAPVIEW
}

より良い(または正しい)代替案は何ですか?-(id)initを回避することは可能ですか?または、サブクラスを追加するたびに、メソッドを呼び出すために、それを-(id)initに書き込む必要がありますか?ありがとうございました!

4

1 に答える 1

2

-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)内にある必要があるため、にアクセスできます-viewDidLoadUIViewControllerサブクラスがのデリゲートとして機能することに注意してください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これで、クラスにへの出口ができましたMKMapViewMKMapViewロードされた後、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あなたは(の内に@implementationViewController持っているでしょう

- (void)viewDidLoad
{
    self.istance = [[SubClass alloc] initWithMapView:self.myMap];
}

SubClass.hあなたは(の内に@interfaceSubClass持っているでしょう

- (id)initWithMapView:(MKMapView *)mapView;
@property (nonatomic, weak, readwrite) MKMapView *mapView;

SubClass.mあなたは(の内に@implementationSubClass持っているでしょう

- (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;
}
于 2012-10-16T14:51:30.847 に答える