在这种情况下没有理由使用-performSelector:。如果您想添加一个在创建对象时初始化 MKMapView 的方法,请从 if (self) 块中调用该方法:
- (id)init
{
self = [super init];
if (self) {
[self setupMapView];
}
return self;
}
- (void)setupMapView
{
// THE CODE TO INITIALIZE MKMAPVIEW
}
是否有第二种方法-setupMapView 或简单地将设置MKMapView 的代码留在-init 方法的if (self) 块中或打破将代码转换为从-init 调用的第二个方法-setupMapView。
话虽如此,听起来您的设置可能会出现其他问题。您的 MKMapView 应该 [最有可能] 在 UIViewController 子类中(可能有一个关联的 XIB),因此您将可以访问 -viewDidLoad。请注意,您的 UIViewController 子类将作为您的 MKMapView 的代表。
更新 1
在您的UIViewController 子类实例中(我假设您将其称为ViewController,您应该有一个IBOutlet 到一个MKMapView 对象。在ViewController.h 中通过(1)添加一个实例变量
@interface ViewController : UIViewController
{
IBOutlet MKMapView *myMap;
}
@end
或通过 (2) 添加 属性
@interface ViewController : UIViewController
@property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap;
@end
现在在 Interface Builder 中打开 ViewController.xib。您应该在视图中有一个MKMapView。如果您还没有,请从对象库中添加一个。右键单击File's Owner。找到包含项目myMap 的行。从行右端的圆圈拖动到可见视图中的MKMapView。
您的ViewController 类现在有了MKMapView 的出口。加载后,您将能够向视图控制器视图的 MKMapView 子视图发送消息。
您应该为您的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 的代理。在 cmets 中,我曾建议创建自己的初始化程序 -initWithMapView:。如果您打算让SubClass 对您的MKMapView 进行一些广泛的设置,那是有道理的。如果您只想让SubClass 成为MKMapView 的代表,则不需要这样的方法。
让我们考虑两种情况:
(1)使用-[SubClass initWithMapView:]的方法:
在ViewController.m 中,您将拥有(在ViewController 的@implementation 内)
- (void)viewDidLoad
{
self.istance = [[SubClass alloc] initWithMapView:self.myMap];
}
在SubClass.h 中,您将拥有(在SubClass 的@interface 内)
- (id)initWithMapView:(MKMapView *)mapView;
@property (nonatomic, weak, readwrite) MKMapView *mapView;
在SubClass.m 中,您将拥有(在SubClass 的@implementation 内)
- (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;
}