2015-04-15 5 views
0

Я использую контроллер разделенного вида в своем приложении. Левая панель (Master View Controller) имеет табличный вид со списком отелей и справа, контроллер подробного просмотра содержит MapView для отображения местоположения. Первоначально я показываю текущее местоположение при запуске приложения. Затем, выбрав значение из таблицы, я пытаюсь показать местоположение отеля на карте. К сожалению, даже при прохождении надлежащей широты значений долготы я все еще не могу изменить регион, и я вообще не вижу никаких изменений в местоположении.Невозможно изменить область MKMapView (местоположение)

Вот фрагмент кода реализации для понимания!

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSDictionary *hotelInfo = [self.hotelDetails objectAtIndex:indexPath.row]; 
    NSString *placeLatitude = [hotelInfo valueForKey:@"Latitude"]; 
    NSString *placeLongitude = [hotelInfo valueForKey:@"Longitude"]; 
    CLLocationCoordinate2D location; 
    location.latitude = [placeLatitude doubleValue]; 
    location.longitude = [placeLongitude doubleValue]; 
    [self setMapViewLocation:location]; 
} 

-(void)setMapViewLocation:(CLLocationCoordinate2D)location 
{ 
    [[MapView sharedMapInstance] updateMapViewWithLocation:location]; 
} 

Вот как я, используя значение местоположения для установки региона для MapView:

-(void)updateMapViewWithLocation:(CLLocationCoordinate2D)location 
{ 
// [self.locationManager startUpdatingLocation]; 
// NSLog(@"latitude:%f,longitude:%f",location.latitude,location.longitude); 
//  
// MKCoordinateRegion region; 
// region.center = location; 
//  
// MKCoordinateSpan span; 
// span.latitudeDelta = 0.015; 
// span.longitudeDelta = 0.015; 
// region.span = span; 
// NSLog(@"Center (%f, %f) span (%f, %f) user: (%f, %f)| IN!", region.center.latitude, region.center.longitude, region.span.latitudeDelta, region.span.longitudeDelta, location.latitude, location.longitude); 
// 
// [self.locationView setRegion:region animated:YES]; 
// MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(location, 800, 800); 
// MKCoordinateSpan span = {.latitudeDelta = 0.015, .longitudeDelta = 0.015}; 
    MKCoordinateRegion region; 
    region.center = location; 
    [self.locationView setRegion:[self.locationView regionThatFits:region] animated:NO]; 
} 

комментируемых линии являются различными комбинациями решений я пытался, но ничего не похоже на работу.

Примечание: Я могу передавать значения координат точно так же, как я нашел правильные значения в журнале.

Может кто-то пожалуйста, помогите мне, спасибо :)

+0

Используете ли вы UISplitViewController? Является ли «MapView sharedMapInstance» одиночным? Использование singleton здесь кажется немного странным. Как «sharedMapInstance» дает вам ссылку на контроллер подробного представления UISplitViewController? – Anna

+0

@Anna Да, я использую UISplitViewController, а sharedMapInstance - одноэлементный. статический MapView * sharedMapInstance = nil; + (MapView *) sharedMapInstance { if (! SharedMapInstance) { sharedMapInstance = [[MapView alloc] init]; } return sharedMapInstance; }. Даже если я создаю экземпляр контроллера подробных представлений в методе didSelectRow без одноэлементного, все же я не вижу изменений в области –

+0

Как экземпляр, созданный sharedMapInstance, такой же, как экземпляр контроллера представления, используемый для контроллера подробного представления в расколе просмотреть контроллер? Они должны быть двумя отдельными вещами. Синглтон - это просто какой-то vc, который вы создаете в памяти, но не тот, который отображается на стороне детали split vc. Таким образом, изменения, внесенные вами в экземпляр singleton, не влияют на видимую деталь vc. – Anna

ответ

1

Благодаря Mr.Anna для указывая мне в правильном направлении. Вместо того, чтобы получить доступ к классу вида детали через одноточечный или создание объекта класса, используйте viewControllers UISplitViewController в массиве для доступа к DetailView, а затем внести изменения, а именно:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSDictionary *hotelInfo = [self.hotelDetails objectAtIndex:indexPath.row]; 
    NSString *placeLatitude = [hotelInfo valueForKey:@"Latitude"]; 
    NSString *placeLongitude = [hotelInfo valueForKey:@"Longitude"]; 
    CLLocationCoordinate2D location; 
    location.latitude = [placeLatitude doubleValue]; 
    location.longitude = [placeLongitude doubleValue]; 
    [self setMapViewLocation:location]; 
} 

-(void)setMapViewLocation:(CLLocationCoordinate2D)location 
{ 
    self.dvc = [self.splitViewController.viewControllers lastObject]; 
    MKCoordinateRegion region; 
    region.center = location; 
    MKCoordinateSpan span; 
    span.latitudeDelta = 0.015; 
    span.longitudeDelta = 0.015; 
    region.span = span; 
    [self.dvc.locationView setRegion:[self.dvc.locationView regionThatFits:region] animated:NO]; 
} 

Надеется, что это помогает, спасибо :)

+1

Объявить detailVC с фактическим типом вашей детали vc (не общий UIViewController) и бросить lastObject. Пример: 'MyDetailViewController * detailVC = (MyDetailViewController *) [self.splitView ...];'. Теперь вам не нужно будет перебирать все подпункты, чтобы найти представление карты, и вы можете напрямую вызвать методы в этом detailVC: '[detailVC updateMapViewWithLocation: location];' – Anna

+0

@Anna Super, вы потрясающий, спасибо :) –

Смежные вопросы