当与核心位置管理器对象一起使用时,initWithCoder实际上在做什么?

时间:2013-10-14 19:20:48

标签: ios objective-c xcode cocoa-touch core-location

好的,所以我想完全理解使用initWithCoder在这段代码中发生了什么。 以下是我在阅读几篇建议的文档并阅读关于授权,核心位置,指定初始化程序的书籍中的章节之后我想到的内容。

  • 使用指向NSCoder对象的指针初始化我的viewcontroler。
  • 如果可行则创建位置管理器对象的实例
  • 使委托成为我的viewcontroller。
  • 将位置准确度设置为最佳。
  • 告诉位置经理开始更新。

  • 将“存储在委托中”的信息记录到控制台。 lat和long存储在指向NSArray对象的指针中,该对象作为参数传递给locationManager:DidUpdateLocations: 方法

  • 如果找不到位置,请在控制台中记录此状态。

.h界面文件:

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface WhereamiViewController : UIViewController
{
    CLLocationManager *locationManager;

}

@end

.m实施文件:

#import "WhereamiViewController.h"

@interface WhereamiViewController ()

@end

@implementation WhereamiViewController

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];

    if (self){
        //create location manager object
        locationManager = [[CLLocationManager alloc] init];

        //there will be a warning from this line of code
        [locationManager setDelegate:self];

        //and we want it to be as accurate as possible
        //regardless of how much time/power it takes
        [locationManager setDesiredAccuracy:kCLLocationAccuracyBest];

        //tell our manager to start looking for its location immediately
        [locationManager startUpdatingLocation];
    }

    return self;
}

- (void)locationManager:(CLLocationManager *)manager
    didUpdateLocations:(NSArray *)locations
{
    NSLog(@"%@", locations);
}

- (void)locationManager:(CLLocationManager *)manager
      didFailWithError:(NSError *)error
{
    NSLog(@"Could not find location: %@", error);
}


@end

其他一些问题:

1)代码的setDelegate部分是否重要,因为“startUpdatingLocation方法将存储它的数据?”

2)存储的数据是否存档?我问,因为我设置的委托具有初始化程序initWithCoder。从我所读到的是归档数据的unarchiver。因此,也许来自locationManager的信息已存档,如果有意义,则需要取消存档。

我在XCode上收到此警告。难道我做错了什么? enter image description here 我还是想以这种方式设置代表,还是有新的方法呢?在另一篇文章中,我记得看到<UIViewControllerDelegate>之类的答案,并被告知将其放入我的界面文件中。

我意识到这篇文章的大部分内容可能都没有意义,我可能完全错了,但我从失败中学到了很多,如果他们选择学习为ios开发,其他人可能会在未来。

感谢您的时间。

此致

2 个答案:

答案 0 :(得分:1)

  

1)代码的setDelegate部分是否重要,因为它就在哪里   “startUpdatingLocation方法会存储它的数据吗?

是的,您将无法接收来自CLLocationManager的数据,因为它无法知道要调用的对象locationManager:didUpdateLocations:locationManager:didFailWithError:以及您没有的其他方法实施了。你应该习惯the delegate pattern in Objective-C

  

2)存储的数据是否存档?我问因为这个事实   委托我设置了初始化程序initWithCoder。从我的角度来看   read是归档数据的unarchiver。也许是来自的信息   locationManager已存档,如果需要,则需要取消存档   感。

数据不会被存档,因为您不会将其存储在任何地方。 CLLocationManager也不会将数据存储在任何位置。

  

我在XCode上收到此警告。我做错了吗?

您错过了视图控制器符合CLLocationManagerDelegate协议的声明。你可以通过替换:

来解决它
@interface WhereamiViewController ()

使用:

@interface WhereamiViewController () <CLLocationManagerDelegate>

您应该阅读working with protocols in Objective-C

答案 1 :(得分:1)

总的来说,是的。

1)是的,这很重要。它告诉想要了解位置更新的位置管理员。 startUpdatingLocation未将数据存储在委托中。 startUpdatingLocation触发位置系统启动并找出您的位置。代表会被告知该位置,并可以随心所欲地完成任务。

2)initWithCoder从档案中重新创建WhereamiViewController。该存档很可能是XIB或故事板。它与位置管理器或委托关系无关。

正如@ArkadiuszHolko所说,你应该指定<CLLocationManagerDelegate>。这样做的目的是告诉编译器您承诺实现协议所需的方法,因此它可以检查您是否会引发问题。