2016-11-20 4 views
0

Я разрабатываю приложение в Xcode (цель-c). У моего приложения есть TableView со списком ресторанов, и когда вы нажимаете одну строку, открывается другой вид с информацией о ресторанах. Метод, который я использую, заключается в том, что я отправляю заголовок в строку в новое представление и в зависимости от названия загружаю информацию о ресторане. Я хочу сделать то же самое с помощью кнопки вывода карты. У меня есть карта с булавками, и я хочу нажать кнопку правой кнопки, чтобы открыть другое представление с информацией о ресторане в зависимости от названия карты.Открыть новый вид с помощью кнопки mapPin Xcode

Может кто-нибудь мне помочь! Я искал учебник и другие сообщения, но в моем случае это не работает. Большое спасибо!

Это мой MapViewController.h:

#import <UIKit/UIKit.h> 
#import <MapKit/MapKit.h> 

@interface MapViewController : UIViewController { 

    MKMapView *mapView; 
} 

@property (weak, nonatomic) IBOutlet UIBarButtonItem *barButton; 

@property (nonatomic, retain) IBOutlet MKMapView *mapView; 

-(IBAction)setMap:(id)sender; 

@end 

Это мой MapViewController.m:

#import "MapViewController.h" 
#import "SWRevealViewController.h" 
#import "RestMapPin.h" 
#import "RestViewController.h" 

@interface MapViewController() 

@end 

@implementation MapViewController 

@synthesize mapView; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    _barButton.target = self.revealViewController; 
    _barButton.action = @selector(revealToggle:); 

    [self.view addGestureRecognizer:self.revealViewController.panGestureRecognizer]; 

    [self.navigationItem setTitle:NSLocalizedString (@"Map", nil)]; /*Cambia el titulo del navigation controller*/ 

    [self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor whiteColor]}]; /*Cambia el color de las letras del navigation controller bar del menu principal*/ 

    [self.navigationController.navigationBar setBarTintColor:[UIColor colorWithRed:27/255.0f green:101/255.0f blue:163/255.0f alpha:1.0f]]; 

    self.navigationController.navigationBar.tintColor = [UIColor whiteColor]; /*Cambia el color del boton de la izquierda*/ 

    mapView.delegate = self; 

    //1 
    //80 Grados 
    MKCoordinateRegion region_80_grados = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_80_grados.center.latitude = 40.42871179999999; 
    region_80_grados.center.longitude = -3.703639100000032; 
    region_80_grados.span.longitudeDelta = 0.1f; 
    region_80_grados.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_80_grados animated:YES]; 

    RestMapPin *ann_80_grados = [[RestMapPin alloc] init]; 
    ann_80_grados.title = @"80 Grados"; 
    ann_80_grados.subtitle = @"Malasaña"; 
    ann_80_grados.coordinate = region_80_grados.center; 
    [mapView addAnnotation:ann_80_grados]; 

    //90 Grados 
    MKCoordinateRegion region_90_grados = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_90_grados.center.latitude = 40.4164161; 
    region_90_grados.center.longitude = -3.6699459999999817; 
    region_90_grados.span.longitudeDelta = 0.1f; 
    region_90_grados.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_90_grados animated:YES]; 

    RestMapPin *ann_90_grados = [[RestMapPin alloc] init]; 
    ann_90_grados.title = @"90 Grados"; 
    ann_90_grados.subtitle = @"Retiro"; 
    ann_90_grados.coordinate = region_90_grados.center; 
    [mapView addAnnotation:ann_90_grados]; 

    /*B&B Babel*/ 
    MKCoordinateRegion region_babel = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_babel.center.latitude = 40.4214535; 
    region_babel.center.longitude = -3.6974301; 
    region_babel.span.longitudeDelta = 0.1f; 
    region_babel.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_babel animated:YES]; 

    RestMapPin *ann_babel = [[RestMapPin alloc] init]; 
    ann_babel.title = @"B&B Babel"; 
    ann_babel.subtitle = @"Barrio de Chueca"; 
    ann_babel.coordinate = region_babel.center; 
    [mapView addAnnotation:ann_babel]; 

    /*Babelia*/ 
    MKCoordinateRegion region_Babelia = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_Babelia.center.latitude = 40.4234778; 
    region_Babelia.center.longitude = -3.686283000000003; 
    region_Babelia.span.longitudeDelta = 0.1f; 
    region_Babelia.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_Babelia animated:YES]; 

    RestMapPin *ann_Babelia = [[RestMapPin alloc] init]; 
    ann_Babelia.title = @"Babelia"; 
    ann_Babelia.subtitle = @"Barrio de Salamanca"; 
    ann_Babelia.coordinate = region_Babelia.center; 
    [mapView addAnnotation:ann_Babelia]; 

    /*Bacira*/ 
    MKCoordinateRegion region_Bacira = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_Bacira.center.latitude = 40.43375390000001; 
    region_Bacira.center.longitude = -3.699036299999989; 
    region_Bacira.span.longitudeDelta = 0.1f; 
    region_Bacira.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_Bacira animated:YES]; 

    RestMapPin *ann_Bacira = [[RestMapPin alloc] init]; 
    ann_Bacira.title = @"Bacira"; 
    ann_Bacira.subtitle = @"Chamberí"; 
    ann_Bacira.coordinate = region_Bacira.center; 
    [mapView addAnnotation:ann_Bacira]; 

    /*Bar Galleta*/ 
    MKCoordinateRegion region_bar_galleta = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_bar_galleta.center.latitude = 40.4227336; 
    region_bar_galleta.center.longitude = -3.7036699999999882; 
    region_bar_galleta.span.longitudeDelta = 0.1f; 
    region_bar_galleta.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_bar_galleta animated:YES]; 

    RestMapPin *ann_bar_galleta = [[RestMapPin alloc] init]; 
    ann_bar_galleta.title = @"Bar Galleta"; 
    ann_bar_galleta.subtitle = @"Malasaña"; 
    ann_bar_galleta.coordinate = region_bar_galleta.center; 
    [mapView addAnnotation:ann_bar_galleta]; 

    /*Bar Tomate*/ 
    MKCoordinateRegion region_bar_tomate = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_bar_tomate.center.latitude = 40.428041; 
    region_bar_tomate.center.longitude = -3.69047; 
    region_bar_tomate.span.longitudeDelta = 0.1f; 
    region_bar_tomate.span.latitudeDelta = 0.1f; 
    [mapView setRegion:region_bar_tomate animated:YES]; 

    RestMapPin *ann_bar_tomate = [[RestMapPin alloc] init]; 
    ann_bar_tomate.title = @"Bar Tomate"; 
    ann_bar_tomate.subtitle = @"Chamberí"; 
    ann_bar_tomate.coordinate = region_bar_tomate.center; 
    [mapView addAnnotation:ann_bar_tomate]; 




    /*Indicador de posicion del mapa (para centrarlo)*/ 
    MKCoordinateRegion region_posicion = { {0.0, 0.0}, {0.0, 0.0}}; 
    region_posicion.center.latitude = 40.44934744420573; 
    region_posicion.center.longitude = -3.695504665374756; 
    region_posicion.span.longitudeDelta = 0.08f; 
    region_posicion.span.latitudeDelta = 0.08f; 
    [mapView setRegion:region_posicion animated:YES]; 
    /*************************************************/ 


} 

-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:(id <MKAnnotation>)annotation 
{ 
    MKAnnotationView *pinView = nil; 
    if(annotation != mapView.userLocation) { 
     static NSString *defaultPinID = @"com.invasivecode.pin"; 
     pinView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:defaultPinID]; 
     if (pinView == nil) 
      pinView = [[MKAnnotationView alloc] 
         initWithAnnotation:annotation reuseIdentifier:defaultPinID]; 


     pinView.canShowCallout = YES; 
     pinView.image = [UIImage imageNamed:@"[email protected]"]; 
    } 
    else { 
     //[mapView.userLocation setTitle:@"I am here"]; 
    } 


    UIButton *pinButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
    if ([[annotation title] isEqualToString:@"Bacira"]) { 

    } 
    pinView.rightCalloutAccessoryView = pinButton; 


    return pinView; 
} 

-(IBAction)setMap:(id)sender { 

    switch (((UISegmentedControl *) sender).selectedSegmentIndex) { 
     case 0: 
      mapView.mapType = MKMapTypeStandard; 
      break; 
     case 1: 
      mapView.mapType = MKMapTypeSatellite; 
      break; 
     case 2: 
      mapView.mapType = MKMapTypeHybrid; 
      break; 
     default: 
      break; 
    } 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

@end 

Это мой RestMapPin.h:

#import <Foundation/Foundation.h> 
#import <MapKit/MapKit.h> 

@interface RestMapPin : NSObject <MKAnnotation> { 

    CLLocationCoordinate2D coordinate; 
    NSString *title; 
    NSString *subtitle; 
} 

@property (nonatomic, assign) CLLocationCoordinate2D coordinate; 
@property (nonatomic, copy) NSString *title; 
@property (nonatomic, copy) NSString *subtitle; 

@end 

И это мой RestMapPin.m:

#import "RestMapPin.h" 

@implementation RestMapPin 

@synthesize coordinate, title, subtitle; 

@end 

Наконец это вид, в котором будет отображаться информация о ресторанах: RestViewController.h:

#import <UIKit/UIKit.h> 
#import "Restaurant.h" 

@interface RestViewController : UIViewController 

@property (strong, nonatomic) IBOutlet UILabel *TitleLabel; 
@property (strong, nonatomic) IBOutlet UILabel *DescriptionLabel; 
@property (strong, nonatomic) IBOutlet UIImageView *ImageView; 

@property (nonatomic, strong) Restaurant *DetailModal; 

@end 

Я konw, что я должен модифицированный мой метод viewForAnnotation, но я не знаю, как это сделать. Чем вы очень за вашу помощь!

ответ

1

Используйте этот метод делегата для правой кнопки подробно

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { 
    RestMapPin *annView = view.annotation; 

    YourViewController *objYourVC= [[YourViewController alloc]init]; 
    objYourVC.title = annView.title; 
    objYourVC.subtitle = annView. subtitle; 

    [self.navigationController pushViewController:objYourVC animated:YES]; 
} 
+0

Извините за мой низкий уровень цели-c. Я написал метод, но Xcode сказал мне: «Использование необъявленного идентификатора« annView »,« view »и« annotation ». Знаете ли вы, почему?' - (void) mapView: (MKMapView *) mapView аннотацииView: (MKAnnotationView *) viewcalloutAccessoryControlTapped : (UIControl *) control { аннотация * annView = view.annotation; RestViewController * objYourVC = [[RestViewController alloc] init]; objYourVC.TitleLabel = annView.заглавие; objYourVC.DescriptionLabel = annView. субтитры; [self.navigationController pushViewController: objYourVC animated: YES]; } ' –

+0

Я обновил вопрос с помощью RestViewController.h, который открывается, когда я нажимаю кнопку в Pin карты. –

+0

аннотация * annView = view.annotation удалите это и напишите эту строку RestMapPin * annView = view.annotation –

0

В другом плакате сказал, использовать вид карты метод делегата mapView:viewCalloutAccessoryControlTapped:.

Я бы предпочел использовать название аннотации, чтобы найти ресторан. Вы не должны использовать отображаемые строки для индексирования в свои данные. Это означает, что если вы измените строку отображения или локализуете для другого языка, ваш поиск больше не будет работать.

Я бы добавил поле идентификатора в ваши аннотации и использовал его.

+0

Я написал этот метод, но Xcode сказал мне: «Использование необъявленного идентификатора« annView »,« просмотр »и« аннотация ». Знаете ли вы, почему? Я обновил вопрос с помощью RestViewController.h, который является тем, кто должен быть открыт, когда я нажимаю кнопку на пиктограмме карты. –

+0

Редактируйте код, чтобы включить код, генерирующий ошибки, а также информацию о том, какие конкретные строки генерируют ошибку и полное сообщение об ошибке, которое вы получаете. –

0

Вы должны сделать это как этот

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { 
     RestMapPin *selectedAnnotation = view.annotation; 
     NSLog("Title of selected pin - %@", selectedAnnotation.title); 
     // Here you get the title of selected annotation 
} 

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

Кроме того, как упоминалось в его ответе @Duncan C, вы не должны использовать String для получения данных с сервера, строки могут быть изменены.

+0

Это работает хорошо, но У меня проблема: строка 'objYourVC.TitleLabel = selectedAnnotation. Title;' хорошо работает в 'MapViewController.m' (например, она показывает @« Bacira »). Но когда я перехожу к другому представлению (называемому' RestViewController .m', 'TitleLabel' ничего не получил (он показывает @" Label "). Есть какой-нибудь способ его решить. Я думаю, что текст не переходит к другому представлению. Извините за мой код, я хочу научиться, и я буду использовать целое число, чтобы получить а в следующих проектах). Большое спасибо за Вашу помощь! –

+0

Отладка вашего кода добавляет точки останова и NSLogs – Rajat

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