好的,所以我想完全理解使用initWithCoder在这段代码中发生了什么。 以下是我在阅读几篇建议的文档并阅读关于授权,核心位置,指定初始化程序的书籍中的章节之后我想到的内容。
告诉位置经理开始更新。
将“存储在委托中”的信息记录到控制台。 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上收到此警告。难道我做错了什么?
我还是想以这种方式设置代表,还是有新的方法呢?在另一篇文章中,我记得看到<UIViewControllerDelegate>
之类的答案,并被告知将其放入我的界面文件中。
我意识到这篇文章的大部分内容可能都没有意义,我可能完全错了,但我从失败中学到了很多,如果他们选择学习为ios开发,其他人可能会在未来。
感谢您的时间。
此致
答案 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>
答案 1 :(得分:1)
总的来说,是的。
1)是的,这很重要。它告诉想要了解位置更新的位置管理员。 startUpdatingLocation
未将数据存储在委托中。 startUpdatingLocation
触发位置系统启动并找出您的位置。代表会被告知该位置,并可以随心所欲地完成任务。
2)initWithCoder
从档案中重新创建WhereamiViewController
。该存档很可能是XIB或故事板。它与位置管理器或委托关系无关。
正如@ArkadiuszHolko所说,你应该指定<CLLocationManagerDelegate>
。这样做的目的是告诉编译器您承诺实现协议所需的方法,因此它可以检查您是否会引发问题。