Метод calloutAccessoryControlTapped (MapView) в панели вкладок приложения вызывает сбой (switchViews) - PullRequest
0 голосов
/ 25 октября 2011

Я создаю приложение панели вкладок, и на одной из вкладок настроен MapView.

Я преобразовал это из приложения на основе представления, которое отлично работало, поэтому я знаю, что оно в основном настроено правильно.

Каждый предварительно размещенный контакт на карте имеет аннотации и leftCalloutAccessoryViewэто ссылки на DetailViewController.Мне нужно, чтобы экран выноски (детализированный контроллер) просто отображался на той же вкладке, но когда я нажимаю на левую кнопку выноски, программа вылетает.

Метод, который я использую для прикосновения к вспомогательному элементу выноски, таков:

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

    NSLog(@"button clicked on annotation %@", annotationTapped);

    LocationsViewController *thisMap = (LocationsViewController *)[[UIApplication sharedApplication] delegate];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];

    dvc.title = view.annotation.title;
    dvc.addressString = view.annotation.subtitle;

    [thisMap switchViews:self.view toView:dvc.view]; //This is the line with the error message
}

В строке '[thisMap switchViews: self.view toView: dvc.view];'Я получаю ошибку SIGABRT.И ошибки:

2011-10-25 14:11:11.465 Miller Tab Bar[56230:207] -[Miller_Tab_BarAppDelegate switchViews:toView:]: unrecognized selector sent to instance 0x5835530
2011-10-25 14:11:11.467 Miller Tab Bar[56230:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[Miller_Tab_BarAppDelegate switchViews:toView:]: unrecognized selector sent to instance 0x5835530'

Недопустим ли метод switchViews в приложении панели вкладок?Если да, то какой метод обычно используется в приложении панели вкладок для переключения представлений на определенной вкладке?Спасибо за помощь, я все еще учусь!


РЕДАКТИРОВАТЬ

Я понял, что я называю это 'self.view', так что вот как я обновил код.У меня был LocationsViewController, установленный в качестве делегата из-за ошибки копирования и вставки.: * 10101 *

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

    NSLog(@"button clicked on annotation %@", annotationTapped);

    LocationsViewController *thisMap = [[LocationsViewController alloc]initWithNibName:@"LocationsViewController" bundle:nil];
    DetailViewController *dvc = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];

    dvc.title = view.annotation.title;
    dvc.addressString = view.annotation.subtitle;

    [thisMap switchViews:self.view toView:dvc.view];
}

Теперь я не получаю ошибку, но она не переключает представления.Он выходит из системы и все, но никуда не уходит.Метод объявлен в LocationsViewController.h и реализован в LocationsViewController.m.Почему бы не ссылаться ни на что?

1 Ответ

1 голос
/ 26 октября 2011

Если вызывающий метод находится в том же классе, что и switchViews, то вам не нужно / не следует создавать новый экземпляр LocationsViewController внутри себя.Вместо [thisMap switchViews... оно должно быть просто [self switchViews....

Однако , не зная точно, что делает этот метод, я не могу быть уверен, что он будет делать то, что ожидалось (например, что он будет делать с self.view, переданным ему -сможет ли он вернуться обратно).

Просто пара других (среди многих) альтернатив, независимо от того, используете ли вы панель вкладок:

  • Отображение подробного вида в качестве контроллера модального представления.Это легко сделать:

    DetailViewController *dvc = [[DetailViewController alloc] init...
    dvc.title = view.annotation.title;
    dvc.addressString = view.annotation.subtitle;
    [self presentModalViewController:dvc animated:YES];
    [dvc release];
    

    Модальное представление будет отклонено с помощью [self dismissModalViewControllerAnimated:YES];.

  • Поместите UINavigationController на вкладку карты и сделайте LocationsViewController корневой контроллер этого навигационного контроллера и нажмите контроллер подробного просмотра.Детальный вид будет затем выскочил, когда сделано.Реализация этого требует немного больше работы, но позволит пользователю использовать другие вкладки, даже когда на вкладке карты отображается подробный вид.

Я предлагаю пройти через Apple.Руководство по программированию контроллера , а также введение в язык: Обучение Objective-C: Учебник для начинающих и Язык программирования Objective-C .

...