InstantiateViewControllerWithIdentifier CRASH (Xcode 4)

У меня были сбои при попытке загрузить мой CafesViewController. Все известные мне идентификаторы в файловом инспекторе установлены на CafesViewController, а также установлен флажок «Использовать идентификатор раскадровки».

Мое главное меню «Вид» загружается отлично, потому что оно определено как раскадровка по умолчанию в моем plist, однако при загрузке опции «Кафе» происходит отключение, когда нажимается кнопка для загрузки списка моих кафе (мое приложение представляет собой городской каталог вещей, которые нужно сделать ).

Мой текущий код:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([mlabel.text isEqualToString: @" Cafés " ])
    {        
    UIStoryboard *cafesViewController = segue.destinationViewController;
    cafesViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"CafesViewController"];
    }
}

Если кто-то может внести свой вклад, я был бы очень признателен, поскольку я не знаю, где разрыв. Ошибка, разумеется, гласит: «NSInvalidArgumentException», причина: «Storyboard() не содержит контроллера представления с идентификатором CafesViewController».

Я думаю, что мой призыв к действию неверен, но может ли кто-нибудь дать мне свой вклад?

Благодарю вас!


person Greg    schedule 20.10.2012    source источник
comment
Здесь есть пара проблем. Во-первых, destinationViewController является контроллером представления и, следовательно, не может быть UIStoryboard. (Я бы подумал, что компилятор пометит это!) Однако более важным является то, что когда вызывается prepareForSegue:, вы уже находитесь в процессе активации нового контроллера представления, поэтому создание экземпляра еще одного контроллера кажется просто неправильная идея.   -  person Phillip Mills    schedule 22.10.2012
comment
Спасибо, Филипп! Я изменил версию, чтобы она читалась так, но не уверен, что это работает:   -  person Greg    schedule 22.10.2012
comment
if ([mlabel.text isEqualToString: @Cafés]) { UIStoryboard *cafes = [UIStoryboard storyboardWithName:@Cafés bundle:nil]; UIViewController *CafesViewController = [cafes instanceiateInitialViewController]; [самостоятельный PresentViewController: CafesViewController анимированный: ДА завершение: ноль]; }   -  person Greg    schedule 22.10.2012
comment
Это сложно, потому что вы правы в том, что моя основная раскадровка уже активирована, и здесь я пытаюсь начать другую с оператора IF, но я не уверен, что еще делать, потому что у меня есть несколько раскадровок, которые нужно активировать с помощью одной кнопки. с этими операторами IF. Интересно, возможно ли это вообще...   -  person Greg    schedule 22.10.2012
comment
Вы считаете, что все мои взгляды должны быть привязаны к ОДНОЙ раскадровке?   -  person Greg    schedule 22.10.2012
comment
Я еще не нашел применения для нескольких раскадровок, за исключением поддержки нескольких типов устройств в универсальных приложениях. (Могут быть и другие причины; мне это просто не нужно.) В основном люди используют одну раскадровку в качестве простого контейнера для контроллеров представлений, а логика программы имеет дело с взаимодействиями с контроллерами.   -  person Phillip Mills    schedule 22.10.2012
comment
Спасибо за помощь, Филипп. Я также нашел здесь отличный ответ, который решил мою проблему: stackoverflow.com/questions/10073662/   -  person Greg    schedule 22.10.2012


Ответы (1)


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

-(void)mainButton
{
  if ([mlabel.text isEqualToString: @" Arts " ])
  {
    [self performSegueWithIdentifier:@"Arts" sender:self];
  }
}

В ходе исследований я узнал, что могу делать то, что хочу, просто через образец с указанной выше кнопкой, а не PrepareForSegue. Очень просто.

person Greg    schedule 26.10.2012