0

我是 iOS 编程的新手。我用 MKMapView 元素创建了 ViewController,我想设置委托[mapView setDelegate:self]

首先,我在方法 initWithNibName:bundle: 中完成了它,例如:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {  
        [[self map] setDelegate:self]];
        UITabBarItem *item = [[UITabBarItem alloc] init];
        [item setTitle:@"Map"];
        [self setTabBarItem:item];
    }
    return self;
}

在这种情况下,MKMapView 没有向我发送任何消息,但是当我将设置委托消息设置为viewDidLoad方法时,它工作正常。

setting delegate message有人可以解释一下为什么它在 in时不起作用initWithNibName:bundle吗?

4

2 回答 2

4

视图不会被加载initWithNibName,它只是初始化您的视图控制器类并加载包含您的视图详细信息的 xib 文件。

当 viewcontroller 调用viewDidLoad时,您将分配并初始化所有视图对象。

在您的情况下,当您setDelegatein时initWithNibname,您在 nil 值上调用它,因此没有设置任何内容,但是在viewDidLoadmapView 中已分配和初始化,因此可以正常工作。

如需更深入的了解,请参阅:

http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/ViewLoadingandUnloading/ViewLoadingandUnloading.html

这里有一个漂亮的解释:一个 UIViewController 诞生的过程是什么(哪个方法遵循哪个)?

希望了解 iOS UIViewController 生命周期

http://thejoeconwayblog.wordpress.com/2012/10/04/view-controller-lifecycle-in-ios-6/

查看生命周期

于 2013-07-11T12:54:53.333 回答
1

这条线是你的问题:

【自图】

initWithNibName地图中尚未初始化,它返回零。

viewDidLoad地图中已经初始化。

于 2013-07-11T13:01:05.890 回答