PerformSegueWithIdentifier не производит повторения с ошибкой идентификатора

Мне сложно работать с функцией PerformSegueWithIdentifier. Я продолжаю получать

"Receiver (<UINavigationController: 0x1e59a9d0>) has no segue with
 identifier 'identA'"

Что я сделал, это:

  • Шаг: создала одно приложение просмотра и добавила метку - "Просмотр контроллера A" в контроллер вида.
  • Шаг: перетащил и сбросил еще один контроллер View и добавил метку - "Просмотреть контроллер B" в новый контроллер представления.
  • Шаг: выберите контроллер просмотра A и выполните команду Редактор- > встроить в навигационный контроллер
  • Шаг: проводной контроллер просмотра A для просмотра контроллера B с нажатием кнопки с идентификатором "identA". Пример: wiring the seque

  • Шаг: добавлен вызов executeSegueWithIdentifier контроллера onView. ViewDidLoad. Вот так:


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.navigationController performSegueWithIdentifier:@"identA" sender:self];
    // Do any additional setup after loading the view, typically from a nib.
}

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

Ответ 1

Вы вызываете performSegueWithIdentifier:sender: на self.navigationController, но вы настраиваете segue на View controller A:

проводной контроллер View A для просмотра контроллера B с нажатием клавиши с Идентификатор "identA"

Попробуйте заменить:

[self.navigationController performSegueWithIdentifier:@"identA" sender:self];

с

[self performSegueWithIdentifier:@"identA" sender:self];

Ответ 2

Еще одно предложение (которое спасло меня сегодня)...

Я уже писал много приложений для iPad и iPhone, используя страницы Master-Detail, навигационные контроллеры и т.д., но сегодня я был в тупике, так как мое простое приложение с двумя экранами iPhone в XCode 5.1 отказалось от меня переходить от одного экран в другой, в UINavigationController.

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

    [self performSegueWithIdentifier:@"segueTest" sender:nil];

В конце концов, я выяснил причину.

Я создал пустой проект в XCode, вручную добавил Storyboard в свой проект, но я пропустил шаг.

Когда вы добавляете раскадровку самостоятельно, вам также нужно зайти в ваш файл .plist и вручную добавить строку, в которой ваше приложение укажет название вашей основной раскадровки.

enter image description here

Если вы этого не сделаете, странно, ваше приложение будет успешно работать, оно будет запущено, вы, вероятно, получите свой первый экран, который будет отображаться успешно... но тогда вещи (например, поиск имен segue) начнут ошибайтесь.

(Вздох.)

Я надеюсь, что это поможет другим жертвам XCode.

Мне нужно пиво...

Ответ 3

Ok. Бит конкретной ситуации здесь, но в моей ситуации я создал UISplitViewController в новом проекте. Я хотел выполнить segue в контроллере подробного представления после нажатия ячейки в представлении главной таблицы. Итак, в didSelectRowAtIndexPath: главной таблицы я выполнил

[[NSNotificationCenter defaultCenter]postNotificationName:@"userDetails"
                                                           object:nil];

и в подробном представлении в viewDidLoad: я добавил наблюдателя и метод экземпляра

[[NSNotificationCenter defaultCenter]addObserver:self
                                        selector:@selector(userDetailsShow)
                                            name:@"userDetails"
                                          object:nil];
-(void)userDetailsShow{
    [self performSegueWithIdentifier:@"userDetails" sender:nil];
}

При нажатии ячейки на главном экране он запускает метод, но ничего не делает. Оказалось, что проблема такова: введите описание изображения здесь

Я оставил серию по умолчанию между ячейкой представления основной таблицы и активным контроллером подробных навигации. В этом случае я не нуждался в этом, поэтому смог удалить его. После его удаления он работал отлично, как и следовало ожидать.
Надеюсь, теперь я смогу вернуть эти волосы...