2013-11-08 3 views
1

У меня есть две информационные кнопки, отображаемые в моем представлении выноска по какой-то причине. У меня есть 3 разных цвета контактов, которые извлекают информацию из трех разных источников. Мне нужна каждая кнопка для каждого цвета штыря, чтобы нажать на отдельный контроллер представления на основе этого класса аннотации. У меня есть следующий код до сих пор для моих 3-х различных цветов штыря:2 AccessoryItems при выноске, показывающем

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation { 

    if([annotation isKindOfClass:[MKUserLocation class]]) { 
     return nil; 
    } 

    static NSString *identifier = @"MyLocation"; 
    if ([annotation isKindOfClass:[annotation class]]) { 

     MKPinAnnotationView *view = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier]; 
     if (view == nil) { 
      view = [[MKPinAnnotationView alloc] 
        initWithAnnotation:annotation 
        reuseIdentifier:identifier]; 
     } else { 

      view.annotation = annotation; 
     } 

     if([[(Annotation*)annotation phoneNumber] isEqualToString:@"0"]){ 


      view.enabled = YES; 
      view.canShowCallout = YES; 
      view.pinColor = MKPinAnnotationColorPurple; 
      // Create a UIButton object to add on the 
      self.leftBtn = [UIButton buttonWithType:UIButtonTypeInfoDark]; 
      [self.leftBtn setTitle:annotation.title forState:UIControlStateNormal]; 

      [view setLeftCalloutAccessoryView:self.leftBtn]; 

     }else{ 

      view.enabled = YES; 
      view.canShowCallout = YES; 

      // Create a UIButton object to add on the 
      self.rightBtn = [UIButton buttonWithType:UIButtonTypeInfoDark]; 
      [self.rightBtn setTitle:annotation.title forState:UIControlStateNormal]; 

      [view setRightCalloutAccessoryView:self.rightBtn]; 

     } 

     if ([[(Annotation*)annotation phoneNumber] isEqualToString:@"1"]){ 

      view.enabled = YES; 
      view.canShowCallout = YES; 
      view.pinColor = MKPinAnnotationColorGreen; 
      // Create a UIButton object to add on the 
      self.leftBtn = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; 
      [self.leftBtn setTitle:annotation.title forState:UIControlStateNormal]; 

      [view setLeftCalloutAccessoryView:self.leftBtn]; 

     } 


     return view; 
    } 

    return nil; 
} 

И для моего аксессуара похлопал метод я следующее:

- (void)mapView:(MKMapView *)map annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control{ 

    if(view.leftCalloutAccessoryView){ 


     UserAnnotation *annotate = view.annotation; 
     BuydealsViewController *dealsView=[[BuydealsViewController alloc]initWithNibName:@"DealDetailsViewViewController" bundle:[NSBundle mainBundle]]; 

     dealsView.urlString = annotate.url; 
     [self.navigationController pushViewController:dealsView animated:YES]; 
} 
    if(view.rightCalloutAccessoryView){ 

     MapDealViewController *mapDeals = [[MapDealViewController alloc] init]; 
     Annotation *annView = view.annotation; 
     mapDeals.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
     mapDeals.phoneNumber = annView.phoneNumber; 
     mapDeals.address = annView.subtitle; 
     mapDeals.title = annView.title; 
     mapDeals.description = annView.description; 
     mapDeals.value = annView.value1; 
     mapDeals.discountPercent = annView.discountPercent; 
     mapDeals.price = annView.price; 
     mapDeals.header = annView.header; 
     mapDeals.imageUrl = annView.imageUrl; 
     mapDeals.url = annView.url; 
     mapDeals.dealy = annView.dealy; 

     self.navigationController.navigationBarHidden = NO; 
     [self.navigationController pushViewController:mapDeals animated:YES]; 

} 



} 

Есть ли способ, чтобы сделать их как правильные кнопки, но нажмите, чтобы разделить виды?

ответ

1

Первый, это может не вызывать никаких проблем в настоящее время, но важно указать.
Эта линия в viewForAnnotation:

if ([annotation isKindOfClass:[annotation class]]) 

выглядит неправильно, потому что конечноannotation будет такой же класс, как сам.
Это всегда будет возвращено YES.

вероятно Вы имели в виде, чтобы написать Annotation class с заглавной буквой A который является именем класса (annotation со строчным a относится к текущему параметру экземпляра аннотации):

if ([annotation isKindOfClass:[Annotation class]]) 


Что касается «У меня есть два по каким-то причинам, в моей подсказке отображаются подсказки.:

Посмотрите на эту упрощенную версию текущей логики в viewForAnnotation:

if (phoneNumber is "0") 
{ 
    ... 
    [view setLeftCalloutAccessoryView:self.leftBtn]; 
} 
else 
{ 
    .... 
    [view setRightCalloutAccessoryView:self.rightBtn]; 
} 

if (phoneNumber is "1") 
{ 
    .... 
    [view setLeftCalloutAccessoryView:self.leftBtn]; 
} 

Обратите внимание, что если PHONENUMBER является "1":

  • вида по rightCalloutAccessoryView устанавливается в else после «1» не «0»,
  • И вид leftCalloutAccessoryView вида находится в второй if (так как это «1»).

Логика для установки видов аксессуаров должна быть скорректирована в соответствии с тем, что вы хотите.

Обратите внимание, что вы должны явно указывать или rightCalloutAccessoryView вида на nil, если данная аннотация не должна иметь этот аксессуар (и, если могут быть другие аннотации). Это связано с тем, что, если просмотр аннотации повторно используется, его аксессуарные представления могут уже устанавливаться на основе аннотации, для которой он ранее использовался. Таким образом, вы могли бы сделать что-то вроде этого:

if (phoneNumber is "0") 
{ 
    ... 
    view.leftCalloutAccessoryView = nil; 
    view.rightCalloutAccessoryView = [UIButton buttonWithType...]; 
} 
else if (phoneNumber is "1") 
{ 
    ... 
    view.leftCalloutAccessoryView = [UIButton buttonWithType...]; 
    view.rightCalloutAccessoryView = nil; 
} 
else 
{ 
    //some default, unexpected case handling... 
    ... 
    view.leftCalloutAccessoryView = nil; 
    view.rightCalloutAccessoryView = nil; 
} 

Кроме того, нет никакой необходимости иметь leftBtn и rightBtn как свойства и может привести к путанице или другие вопросы. Просто объявите их как локальные переменные.


Что касается «Есть ли способ, чтобы сделать их как правильные кнопки, но нажмите на отдельные взгляды?»:

Да. У вас уже есть код в viewForAnnotation, что делает это:

  • Вы можете проверить annotation объекта, class (но сделать это правильно, используя класс имени , а не экземпляра переменных).
  • Вы можете добавить annotation в свой собственный класс и проверить нестандартные значения свойств (например, phoneNumber).
+0

Woah, это было потрясающе! Да, я не понимал, что установил условия для своего MKUserLocation для аннотации, а другой для моего класса Annotation. Спасибо тебе за это! –

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