Добавление UIButtonTypeDetailDisclosure - проблема логики - PullRequest
2 голосов
/ 02 февраля 2012

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

, например: если это Больница, на которую я нажимаю, и всплывающее окнодаст имя и кнопку UIButtonTypeDetailDisclosure.Когда я нажимаю на кнопку UIButtonTypeDetailDisclosure, я должен перенаправить в другой вид, который дает больше информации об этой больнице.

Мой код:

-(void)callingMap:(NSArray *)hospitalArray {
 for(Hospital *hospital in hospitalArray)
        {
                MKCoordinateRegion region = { {0.0, 0.0 }, { 0.0, 0.0 } };                 
                region.center.latitude =  hospital.lati;                
                region.center.longitude = hospital.longi;
                [self.mapView setRegion:region animated:YES];               
                DetailMap *hospitalInfo = [[DetailMap alloc] init];             
                hospitalInfo.title = [hospital name];               
                hospitalInfo.subtitle = [hospital address];     
                hospitalInfo.coordinate = region.center;                
                [self.mapView addAnnotation:hospitalInfo];            
        }   
    }    
}


-(MKAnnotationView *)mapView:(MKMapView *)mV viewForAnnotation:
(id <MKAnnotation>)annotation {     
    MKAnnotationView* ann = nil;    
    if(annotation != mapView.userLocation) 
    {
        ann = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"try"];    
        ann.canShowCallout = YES;    
        ann.image = [UIImage imageNamed:@"arrow.png"];        
        UIButton* butt = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];    
        [butt addTarget:self action:@selector(displayArrow:) forControlEvents:     
        UIControlEventTouchUpInside];        
        ann.rightCalloutAccessoryView = butt;    
    }
    return ann;
}

-(void)displayArrow:(id)sender{
        MoreHospitalDetailViewController *mhdvc = [[MoreHospitalDetailViewController alloc] initWithNibName:nil bundle:nil];

        mhdvc.hospitalArray = ????????  

        // in the MoreHospitalDetailViewController i have an Array called hospitalArray. I need to insert the selected hospital object (after clicking the particular arrow)  to this array and pass it to the next view. How to do it ?        // 
        [self.navigationController pushViewController:mhdvc animated:YES];   
}

В MoreHospitalDetailViewController у меня естьМассив называется hospitalArray.Мне нужно вставить выбранный hospital object (после нажатия определенной стрелки) в этот массив и передать его в следующем представлении.Как это сделать?

примечание: на карте может быть много элементов (аннотаций), так как узнать, на какой объект больницы я щелкнул, когда я использую метод (void)displayArrow:(id)sender?

Помогите мне потеряться

1 Ответ

2 голосов
/ 02 февраля 2012

В методе displayArrow: вы можете получить ссылку на аннотацию, по которой щелкнули, используя:

DetailMap *hospitalInfo 
    = (DetailMap *)[mapView.selectedAnnotations objectAtIndex:0];


Обратите внимание, что вы также можете использовать calloutAccessoryControlTapped метод делегата вида карты * 1007.* вместо addTarget и написания пользовательского метода .Например:

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

    //do something with the annotation...
}


У вас есть два класса:
  • Hospital, который содержит полную информацию о больнице, включая номер телефона и т. Д.
  • DetailMap, который реализует MKAnnotation и содержит только координату, имя и адрес больницы (, но не номер телефона или что-либо еще )

При нажатии на выноскуКнопка аннотации, вы хотите получить доступ к полной информации больницы (не только координаты, имя и адрес).

Сначала, когда вы говорите в комментариях "DetailMap, который толькосодержит 2 записи ", вы на самом деле имеете в виду« поля »или« свойства »вместо« записи »(каждый объект больницы является« записью »).

Вот несколько способов решить эту проблему:

  • В DetailMap добавьте свойство с именем say hospital типа Hospital и задайте его при создании DetailMap объектов в методе callingMap (hospitalInfo.hospital = hospital).Затем в методе displayArrow: вы можете добавить это свойство в массив (mhdvc.hospitalArray = [NSArray arrayWithObject:hospitalInfo.hospital];).

  • Измените класс Hospital, чтобы он сам реализовывал MKAnnotation, и исключитекласс DetailMap полностью.Затем вы можете напрямую передать Hospital объекты в addAnnotation и в методе displayArrow: вы сделаете это:

    Hospital *hospital = (Hospital *)[mapView.selectedAnnotations objectAtIndex:0];
    mhdvc.hospitalArray = [NSArray arrayWithObject:hospital];
    

Первый вариант проще, так как вы ужесоздал класс DetailMap, но второй класс чище.

Тем не менее, MoreHospitalDetailViewController не нужен массив для передачи одного объекта больницы (который содержит несколько полей).Вы можете просто объявить свойство Hospital *hospital в MoreHospitalDetailViewController для передачи одного объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...