Возврат к просмотру карты после открытия нового контроллера с помощью кнопки раскрытия аннотации

Я делаю приложение, в котором на карте есть несколько контактов. (используя xcode для приложений iOS). Когда я нажимаю на булавки, в выноске появляется кнопка раскрытия, которая при нажатии вызывает новый контроллер представления (который я использую в качестве подробного представления... это правильно?)

В настоящее время у меня возникают проблемы с возвратом к исходному контроллеру просмотра после просмотра нового контроллера просмотра.

Как мне вернуться к просмотру карты?

Я пробовал с -(IBAction)Back; команду и связать ее с кнопкой на новом контроллере просмотра, однако, когда я нажимаю ее в симуляторе, появляется черный экран, и на выходе не отображается ошибка.

Любая помощь будет оценена по достоинству!

Я использовал следующее для просмотра нового контроллера представления:

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


    if ([view.annotation.title isEqualToString:@"..."]) {

            ...Controller *sampleView = [[...Controller alloc] init];
            [self presentModalViewController:sampleView animated:YES];

    }

    if ([view.annotation.title isEqualToString:@"..."]){
       ...ViewController *sampleView = [[...ViewController alloc] init];
        [self presentModalViewController:sampleView animated:YES];
    }
}

РЕДАКТИРОВАТЬ 1: это код ошибки, который я получаю после внесения изменений.

2013-06-30 18:02:30.386 lam[15156:13d03] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "...Controller" nib but the view outlet was not set.'
*** First throw call stack:
(0x1e2d012 0x126ae7e 0x1e2cdeb 0xf88c8 0xf8dc8 0xf8ff8 0xf9232 0x104c25 0x3043a3 0x101ee3 0x102167 0xfee0071 0x374c 0x10deb1a 0x10ea28e 0x82f617f 0x127e705 0x1b2c0 0x1b258 0xdc021 0xdc57f 0xdb6e8 0x4acef 0x4af02 0x28d4a 0x1a698 0x1d88df9 0x1db0f3f 0x1db096f 0x1dd3734 0x1dd2f44 0x1dd2e1b 0x1d877e3 0x1d87668 0x17ffc 0x2842 0x2775)
libc++abi.dylib: terminate called throwing an exception

person Community    schedule 30.06.2013    source источник


Ответы (1)


Как ваш calloutAccessoryControlTapped "воспитал" этот новый контроллер представления?

Если вы использовали модальный переход (например, такой как presentViewController или модальный переход), то вы бы отклонили его с помощью dismissViewControllerAnimated. Если вы использовали устаревший presentModalViewController, то вы использовали бы dismissModalViewControllerAnimated, но опять же, вам, вероятно, не следует использовать устаревшие методы, если вам не требуется поддержка версий iOS до 5.0. Вместо этого используйте версии presentViewController и dismissViewControllerAnimated. В любом случае, вы можете получить метод IBAction, например:

- (IBAction)handleDoneButton:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:nil];
}

Если вы использовали push-переход (например, pushViewController или push-переход), то вы, как правило, просто воспользовались встроенной кнопкой «назад», но если вам нужна собственная кнопка, чтобы вытолкнуть этот контроллер, вы должны использовать IBAction с popViewControllerAnimated. Например:

- (IBAction)handleDoneButton:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES completion:nil];
}

Или, если ваш calloutAccessoryControlTapped использовал performSegueWithIdentifier, то вы могли бы либо использовать описанную выше технику, либо, в iOS 6 и выше, вы могли бы определить следующий переход раскрутки в контроллере представления, у которого есть карта:

- (IBAction)backToMap:(UIStoryboardSegue *)segue
{
    // do whatever you want
}

А затем вы можете control-перетащить от кнопки к выходу на панели под сценой, и вы должны увидеть этот backToMap раскручивающийся переход.


Что касается вашей ошибки, это означает, что корневой вид вашего NIB не установлен. Выберите вид и посмотрите на его выходы. Вы должны увидеть что-то вроде:

если вид настроен правильно

Если нет, (а) убедитесь, что вы установили своего «владельца файла» в качестве класса вашего контроллера представления; и (б) щелкните правой кнопкой мыши «Владелец файла»; (c) перетащите из «o» рядом с «представлением» во всплывающем окне в фактическое представление:

введите здесь описание изображения

Кроме того, при создании контроллера представления вы, вероятно, захотите указать, какой NIB использовать:

ViewController *controller;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
    controller = [[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil];
} else {
    controller = [[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil];
}
person Rob    schedule 30.06.2013
comment
Я только что обновил свой вопрос кодом, который я использовал для вызова нового контроллера просмотра. - person ; 30.06.2013
comment
Большое тебе спасибо. Где именно я должен поместить dispresentViewControllerAnimated? - person ; 30.06.2013
comment
@DCB Создайте метод IBAction для кнопки закрытия во втором контроллере представления, а затем поместите туда код dismissModalViewControllerAnimated. - person Rob; 30.06.2013
comment
Итак, в моем файле .h я использую -(IBAction)dismiss; а затем в моем файле .m какой точный код я должен использовать? -(IBAction)отклонить {отклонитьViewControllerAnimated ..? } - person ; 30.06.2013
comment
Большое спасибо! Как только у меня будет минутка, я постараюсь принять ваш ответ! :) - person ; 30.06.2013
comment
Я изменил presentModalViewController на presentViewController, но теперь получаю предупреждение: метод экземпляра '-presentViewController: animated:' не найден (тип возврата по умолчанию равен id), и когда я запускаю его в симуляторе, он дает мне ошибку lldb, когда я нажимаю кнопка, связанная с этим действием... - person ; 30.06.2013
comment
Я добавил завершение: ноль, но все равно получаю сообщение об ошибке. Я добавил ошибку как редактирование в вопросе. - person ; 30.06.2013
comment
Я считаю, что все уже правильно.. контроллер не совсем то же самое, что перо. у меня есть два файла пера для firstViewController, 1. FirstViewController_iPhone.xib и 2-FirstViewController_iPad.xib. Вы могли бы помочь мне решить эту проблему без чата? - person ; 30.06.2013
comment
Я сделал все, что вы написали, но я все еще получаю сообщение об ошибке... я знаю, что это, вероятно, очень легко решить... - person ; 30.06.2013
comment
давайте продолжим обсуждение в чате - person ; 30.06.2013
comment
Привет @Rob, у меня снова есть вопрос, похожий на этот вопрос (я уже создал другой вопрос ..) Вместо того, чтобы иметь второй контроллер представления в перьях, могу ли я использовать раскадровки? Другими словами, я хотел бы связать вторую вкладку с раскадровкой вместо xib, который я сейчас использую. Я знаю, что цель раскадровки состоит в том, чтобы иметь связи между ними, и использование обоих может показаться немного странным ... но на данный момент у меня нет времени переписывать две другие вкладки. stackoverflow.com/questions/20458989/ - person ; 10.12.2013
comment
Я не совсем уверен, куда я должен поместить instanceiateViewControllerWithIdentifier: Если я могу отправить вам файл, как в прошлый раз, не могли бы вы его посмотреть? - person ; 16.12.2013
comment
ОК... Но тогда куда делась раскадровкаWithName:? - person ; 16.12.2013
comment
@DCB Кстати, я добавил ответ на другой ваш вопрос. Я предлагаю вам удалить все ваши комментарии, которые не имеют отношения к вопросу, указанному выше. В будущем размещайте любые последующие комментарии к соответствующему вопросу. - person Rob; 16.12.2013