Как передать тег отправителя в DetailView, чтобы получить приложение карты по умолчанию для направления? - PullRequest
0 голосов
/ 24 ноября 2011

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

Отредактировано :: with - (IBAction) showDirectionUpdated;кодирование

      -(IBAction)showDirectionUpdated;
    {

NSIndexPath *selectedIndexPath = [self._tableView indexPathForSelectedRow];

if( selectedIndexPath == [self._tableView indexPathForSelectedRow])
 {
    marker *aMarker = (marker *)[appDelegate.markers objectAtIndex:selectedIndexPath.row];

NSString *EndLoc=[NSString stringWithFormat:@"%@ %@", aMarker.address,aMarker.city];

NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=Current Location&daddr=%@",EndLoc];
        NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        [[UIApplication sharedApplication] openURL:url];
        NSLog(@"%@",url);
        [url release];      

[self._tableView deselectRowAtIndexPath:selectedIndexPath animated:YES];
}
else
{ 

     //here if I am opening the detailview from annotation callout button and calling 
   // direction in map default app. But respective address is not passing 
    //in default map app
    NSInteger selectedIndex = [sender tag];
    AddressAnnotation *selectedObject = [self.annobjs objectAtIndex:selectedIndex];

marker *aMarker = [appDelegate.markers objectAtIndex:selectedIndex];
        NSString *EndLoc=[NSString stringWithFormat:@"%@ %@", aMarker.address,aMarker.city];

        NSString* addr = [NSString stringWithFormat:@"http://maps.google.com/maps?saddr=Current Location&daddr=%@",EndLoc];
        NSURL* url = [[NSURL alloc] initWithString:[addr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        [[UIApplication sharedApplication] openURL:url];
        NSLog(@"%@",url);
        [url release];

    }

}

Я хочу передать некоторый отправитель или идентификатор для вызова соответствующего направления из detailView, которое я получаю при нажатии аннотации.Я успешно получаю приложение по умолчанию для направления из подробного просмотра, который я получаю, выбирая tableview (listview).Вот некоторый код тега отправителя.

Отредактировано 2 === с viewForAnnotation

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id   <MKAnnotation>) annotation
 {     MKAnnotationView *annView = (MKAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@""];

 if (annView == nil)
 {
    annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@""] autorelease];
    annView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

}


annView.image = [UIImage imageNamed:@"flag.png"];
annView.annotation = annotation;
[annView setEnabled:YES];
[annView setCanShowCallout:YES];
 return annView;

 }

 -(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
  {
NSLog(@"calloutAccessoryControlTapped");

MKAnnotationView* annView = (MKAnnotationView*) view;
AddressAnnotation* annotation = (AddressAnnotation*)[annView annotation];


if(BcardView.hidden == YES)
{
    SearchView.hidden = YES;

    BcardView.hidden = NO;


    BackButtontitle.text = @"Map View";

    marker *aMarker = [[marker alloc]init];

    ShowroomName.text = aMarker.name;
      }}

1 Ответ

2 голосов
/ 28 ноября 2011

Основываясь на опубликованном коде, я понимаю следующее:

marker - это класс верхнего уровня, в котором хранятся все сведения о местоположении, включая address и city.

AddressAnnotation - это класс, который реализует протокол MKAnnotation, в настоящее время содержащий только координаты, заголовок и субтитры для местоположения (он не имеет address и city).Это класс, используемый для создания объектов, которые передаются в метод addAnnotation представления карты.

Что вы хотели бы сделать, это то, что, когда кнопка аннотации нажата на аннотации, вы хотели бы показать некоторыеподробный вид или информация, требующая address и city.

Вместо того, чтобы пытаться отслеживать индексы массива с помощью тегов или искать объекты в массивах, я предлагаю добавить ссылку на marker вAddressAnnotation.Таким образом, если у вас есть объект AddressAnnotation, вы можете получить связанный с ним объект marker, используя эту ссылку (не требуется поиск или индексы).

В классе AddressAnnotation добавьте свойство retain:тип marker называется parentMarker.При создании объекта AddressAnnotation из marker и перед вызовом addAnnotation установите для свойства parentMarker текущее значение marker.

Затем в calloutAccessoryControlTapped приведите view.annotation кAddressAnnotation для быстрого доступа к свойству parentMarker.Теперь вы можете получить address и city от маркера.(Кстати, в этом методе вам не нужно приводить view к MKAnnotationView, поскольку он уже равен единице, и вам не нужно называть его annView.)

Я не являюсьуверен, что такое BcardView и почему вы проверяете, скрыт он или нет.

Я бы также предложил немного улучшить метод viewForAnnotation (используйте непустой идентификатор повторного использования и переместитеустановка свойств, которые не изменяются внутри if):

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>) annotation
{
    MKAnnotationView *annView = (MKAnnotationView *)[mapView 
        dequeueReusableAnnotationViewWithIdentifier:@"AddrAnnot"];

    if (annView == nil)
    {
        annView = [[[MKAnnotationView alloc] initWithAnnotation:annotation 
            reuseIdentifier:@"AddrAnnot"] autorelease];
        annView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        annView.image = [UIImage imageNamed:@"flag.png"];
        [annView setEnabled:YES];
        [annView setCanShowCallout:YES];
    }

    annView.annotation = annotation;

    return annView;
}
...