didUpdateUserLocation 未在重新加载视图时调用

Posted

技术标签:

【中文标题】didUpdateUserLocation 未在重新加载视图时调用【英文标题】:didUpdateUserLocation not calling with view reloaded 【发布时间】:2013-02-20 18:07:31 【问题描述】:

我的 ios 应用程序出现错误。我在google和here中搜索过,但没有找到具体的解决方案!

我有一个名为 mapView 的 viewController,我会在我的应用程序中使用它,这个视图包含一个 MKMapView 和代码。

在我的 mapView.h 中有:

@property (strong, nonatomic) IBOutlet MKMapView *mapSpot;

在我的 mapView.m 中有:

- (void)viewDidLoad 
    [super viewDidLoad];

    [mapSpot setShowsUserLocation:YES];


- (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation    
    MKCoordinateRegion region           = MKCoordinateRegionMakeWithDistance([userLocation coordinate], 500, 500);
    [mapSpot setRegion:region animated:YES];

所以,我首先将 mapView 加载到其他 ViewController 中:

@property (strong, nonatomic) ViewMap *mapView;

mapView                         = [[ViewMap alloc] initWithNibName:@"ViewMap" bundle:nil];
[self.view addSubview:[mapView view]];

我卸载了该 ViewController 并在另一个 ViewController 中再次加载 MapView,但此时方法: - (void) mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation 没有被调用。

我验证第一个 ViewController 是否已卸载并且是。

当我加载第二个 ViewController 时,会有一个新的 MapView 实例,但没有调用委托方法。

有人知道吗?

谢谢

================================================ ====================================

编辑并解决:

【问题讨论】:

您应该将您的解决方案作为答案发布并接受您自己的答案。 随解决方案添加答案,谢谢 答案在哪里?我也有同样的问题 【参考方案1】:

问题在于您在这一行中添加视图的方式

[self.view addSubview:[mapView view]];

如果您只添加视图,则不会执行控制器代码,而是必须显示mapView,例如:

[self presentViewController:mapView animated:YES completion:nil];

【讨论】:

这不是问题,我尝试使用 presentViewController 并没有解决问题,并且在 iphone presentViewController 中全屏加载视图,这在我的应用程序中是不可能的。 另一个问题是,为什么当我第一次加载和重新加载相同的视图工作时工作正常,而当我更改视图不起作用时?谢谢【参考方案2】:

上面的问题,可能是因为我用模拟器测试app,模拟器怎么不改变位置图没有得到didUpdateUserLocation:

这是我在查看代码、组织类阅读文档并再次出现错误后可以得到的唯一解释。

现在,我使用 CLLocationManager 来获取位置,在第一次获得位置后我停止它。

将来我会实现一个跟踪用户路径的系统,所以使用 CLLocationManager 是不可避免的。

修改后的mapView.m代码:

- (void)viewDidLoad 
    [super viewDidLoad];

    locationManager                     = [[CLLocationManager alloc] init];
    locationManager.delegate            = self;
    locationManager.distanceFilter      = kCLDistanceFilterNone;
    locationManager.desiredAccuracy     = kCLLocationAccuracyBest;
    [locationManager startUpdatingLocation];


- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
    CLLocation *loc = [locations lastObject];

    //  store the location to use in any moment, it needs to be checked because the first time when get the coordinate not pass infos to load places according the current position
    if (!location.latitude) 
        location                            = [loc coordinate];

//      set center the map at the current position
        MKCoordinateRegion region           = MKCoordinateRegionMakeWithDistance(location, 500, 500);
        [mapSpotView setRegion:region animated:YES];

        [[NSNotificationCenter defaultCenter] postNotificationName:@"loadPlaces" object:nil];

        [locationManager stopUpdatingLocation];
    

如果有人有更好的解决方案,请在此处发布!

就是这样!

【讨论】:

以上是关于didUpdateUserLocation 未在重新加载视图时调用的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 登录消息:“URL 被阻止:此重定向失败,因为重定向 URI 未在应用程序的客户端 OAuth 设置中列入白名单。”

为啥我们在重试请求之间应用延迟

TabView 在重绘时是不是会错过导航点击?

为啥 perror() 在重定向时会改变流的方向?

在重定向期间切换协议

laravel 4.2在重定向时重新生成会话