【问题标题】:CLLocationManager not calling its delegate methodCLLocationManager 没有调用它的委托方法
【发布时间】:2013-04-01 11:28:07
【问题描述】:

我正在开发一个应用程序,该应用程序涉及在 X 分钟内跟踪新位置并更新到服务器。当时间差异等于或大于 X 分钟时,我将停止位置更新,然后发送到服务器,如果小于 X 分钟,则开始更新位置。但是当它小于 X 分钟时,不会调用 didUpdateToLocation 委托方法。

我在这里发布我的代码:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation
{
   if (theDiff > 10.0f || myDate == nil) 
        {
            [self stopUpdating];
         }
        else
        {
            [self.mLocationManager startUpdatingLocation];
        }

}

【问题讨论】:

  • 您在 .h 中添加了 吗?
  • 是的,我在我的 .h 文件中添加了
  • 我的意思是协议?即 UIViewController
  • 在 .m viewDidLoad 中设置委托
  • 你必须写这个 [self.mLocationManager startUpdatingLocation];在您的 viewdidload 方法中添加一行。查看我的答案。谢谢

标签: ios core-location


【解决方案1】:

试试这个,

//in your .h

CLLocationManager *locationManager;

@property (nonatomic,retain) CLLocationManager *locationManager;

// Then synthesize it in your .m

@synthesize locationManager;

//in your viewDidLoad

locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; // whenever we move
locationManager.desiredAccuracy = kCLLocationAccuracyHundredMeters; // 100 m
[locationManager startUpdatingLocation];

这将在您使用手机移动时调用该方法。您也可以通过更改模拟器位置来检查这一点。

希望这会有所帮助。谢谢,编码愉快。

【讨论】:

  • 是的,我在 viewDidLoad 中有相同的行。但我的问题是在时间差异小于 X 分钟时再次更新位置。几分钟后我将数据发送到服务器,然后再次更新位置,这工作正常。但如果小于 X 分钟,它应该再次调用 DidUpdateToLocation 方法。
  • 好的,你必须把你的时间检查条件代码写出函数。因为一旦它调用了 stopupdate,它就不能再调用 didUpdateToLocation 方法,直到它进入条件。
【解决方案2】:

在 .m 中试试这个添加这个方法,或者如果你有任何其他自定义代码发布它

-(void)LocationWithTime
{
    [CLController sharedInstance].locationManager.desiredAccuracy = 100.0;
    [CLController sharedInstance].delegate = self;
    BOOL locationAccessAllowed = NO ;

    if( [CLLocationManager respondsToSelector:@selector(locationServicesEnabled)] )
    {
        locationAccessAllowed = [CLLocationManager locationServicesEnabled] ;
    }
    if(locationAccessAllowed == YES)
    {

        [[CLController sharedInstance].locationManager startUpdatingLocation];
    }

}

这是我使用的委托方法 -

-(void)newLocationUpdate:(NSString *)latvalue longValue:(NSString*)longvalue Error:(int) errCode
{



    DebugLog(@"LatLong values %@ %@", [UserContext sharedInstance].strLat, [UserContext sharedInstance].strLong);

    self.strLALat = latvalue;
    self.strLALong = longvalue;

    [[CLController sharedInstance].locationManager stopUpdatingLocation];
    [CLController sharedInstance].delegate=nil ;
}

【讨论】:

  • 谢谢 :) 让我试试这个
【解决方案3】:

摘自 Apple API 文档,

/* * locationManager:didUpdateToLocation:fromLocation: *
* 此方法已弃用。如果 locationManager:didUpdateLocations: 是 * 实现后,该方法不会被调用。 */

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_6, __MAC_NA, __IPHONE_2_0, __IPHONE_6_0);

改用下面的委托方法,

/* * locationManager:didUpdateLocations: * locations 是按时间顺序排列的 CLLocation 对象数组。 */

- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_6_0);

这将在您设置委托后起作用。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-12-03
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多