没有理由-performSelector:
在这种情况下使用。如果要添加一个MKMapView
在创建对象时初始化的方法,请从if (self)
块中调用该方法:
- (id)init
{
self = [super init];
if (self) {
[self setupMapView];
}
return self;
}
- (void)setupMapView
{
// THE CODE TO INITIALIZE MKMAPVIEW
}
是否有第二种方法-setupMapView
或简单地将用于设置的代码留在MKMapView
方法if (self)
块中-init
或将代码分解为第二种方法-setupMapView
称为 from ,这是个人喜好/风格的问题-init
。
话虽如此,听起来您的设置可能会出现其他问题。您的 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
现在ViewController.xib
在 Interface Builder 中打开。你应该有一个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
。在评论中,我建议创建自己的初始化程序-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;
}