我已经在我的应用程序中实现了pull刷新,当拉动启动位置管理器以获得用户位置的修复时,然后呈现一个显示该位置的模态视图控制器。
我遇到的问题是模态视图控制器在获取用户位置之前呈现,导致空白地图再持续几秒钟,直到获得并更新。
我有一个属性,用于保存用户当前位置。在刷新调用'showMap'之前,是否有可能'保持'直到该属性不是nil(即已建立位置),也许如果它在设定的时间后找不到用户它可能只是出现错误?我尝试使用'while'循环来不断检查currentLocation属性,但这似乎不是正确的事情,并且无论如何都不起作用。
这是我在viewDidLoad中设置的刷新代码:
__typeof (&*self) __weak weakSelf = self;
[self.scrollView addPullToRefreshWithActionHandler:^ {
int64_t delayInSeconds = 1.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[weakSelf showMap];
});
}];
当使用pull to refresh时,它会调用以下方法:
- (void)showMap
{
[self.locationManager updateCurrentLocation];
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(finishRefresh) userInfo:nil repeats:NO];
}
- (void)finishRefresh
{
[self.scrollView.pullToRefreshController didFinishRefresh];
[self performSegueWithIdentifier:@"showMap" sender:self];
}
答案 0 :(得分:0)
为避免过早显示地图,您应该等待异步更新操作,并且最干净的模式将是委派。关于它在Cocoa / Cocoa Touch中的应用,这里是a nice Apple Doc。
然后它将大致像这样工作:
locationManager
会通知您的控制器,控制器会显示地图。我不知道您的位置管理器类的接口,但如果它是CLLocationManager,则可以通过这种方式完成。
CLLocationManager具有委托属性。您的视图控制器应该:
locationManager
locationManager:didUpdateLocations:
方法 - 当位置数据到达并准备好使用时,它会被调用。此方法的实现应该大致如下:
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations
{
/*
* shouldShowMap — BOOL property of View Controller, actually optional
* but allowing to filter out handling of unwanted location updates
* so they will not trigger map segue every time
*/
if (self.shouldShowMap) {
[self performSegueWithIdentifier:@"showMap" sender:self];
self.shouldShowMap = NO;
}
// stop updating location — you need only one update, not a stream of consecutive updates
[self.locationManager stopUpdatingLocation];
}
您的Pull-to-Refresh处理程序应如下所示:
__typeof (&*self) __weak weakSelf = self;
[self.scrollView addPullToRefreshWithActionHandler:^ {
self.shouldShowMap = YES;
[weakSelf.locationManager startUpdatingLocation];
}];
希望它有所帮助。最好的学习方法(好吧,在大多数案例中)是研究如何在系统框架中实现内容。从这个方向思考,你肯定会想出一个解决方案:)
如果您需要澄清,请随时提出,我可能没有清楚地解释清楚。