0

我有一个 NSObject 的子类,我想在其中立即调用(一种 -(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(第二选择)

-(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
}

是否有第二种方法-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你将拥有(在 之@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 回答