我有一个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
}
OR SubClass.m(第二种选择)
-(id)init{
[self performSelector:@selector(myMethod)];
return self;
}
-myMethod{
// THE CODE TO INITIALIZE MKMAPVIEW
}
有什么更好(或更正确)的选择?有可能避免 - (id)init吗?或者每次我添加一个子类,调用一个方法我必须把它写入 - (id)init?谢谢!
答案 0 :(得分:2)
在此上下文中没有理由使用-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
的代码1}}方法或将代码分解为从-setupMapView
调用的第二个方法-init
。
话虽如此,听起来其他事情可能会因您的设置而关闭。你的MKMapView [很可能]应该在UIViewController
子类中(可能有一个关联的XIB
),这样你就可以访问-viewDidLoad
。请注意,您的UIViewController
子类将作为MKMapView
的代理人。
在您的UIViewController
子类实例中(我假设您将其称为ViewController
,您应该IBOutlet
到MKMapView
个对象。请在{{1}中执行此操作通过(1)添加实例变量
ViewController.h
或通过(2)添加属性
@interface ViewController : UIViewController
{
IBOutlet MKMapView *myMap;
}
@end
现在在Interface Builder中打开@interface ViewController : UIViewController
@property (nonatomic, strong, readwrite) IBOutlet MKMapView *myMap;
@end
。您应该在视图中有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
。如果您计划-initWithMapView:
对SubClass
进行广泛的设置,那么这是有道理的。如果您只想让MKMapView
成为SubClass
的代表,则不需要这样的方法。
让我们考虑两种情况:
(1)使用方法MKMapView
:
您将-[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
(2)使用- (id)initWithMapView:(MKMapView *)mapView
{
self = [super init];
if (self) {
self.mapView = mapView;
self.mapView.delegate = self;
//more setup of mapView.
}
return self;
}
:
相反,在-[SubClass init]
中你会有
ViewController.m