Переходы, инициированные непосредственно из предупреждения контроллеров представления в раскадровке xcode

Привет, я создал кнопку программно и подключил ее к другому представлению, но у меня появилось предупреждение о переходе

что я должен использовать метод prepareForSegue для раскадровки, но я не знаю, как это сделать, в Интернете есть образцы, но я получаю сообщение об ошибке, когда использую этот образец, не могли бы вы мне помочь

вот мой код

Создание кнопки

 UIButton * button = [UIButton buttonWithType:UIButtonTypeCustom]; 
 button.backgroundColor=[UIColor colorWithRed: 201.0/255.0 green: 201.0/255.0 blue:201.0/255.0 alpha: 1.0];
 button.tag = currentTag;
 currentTag++;
 [button.layer setBorderColor: [[UIColor blackColor] CGColor]];
 [button.layer setBorderWidth: 1.0];
 [button setTitle:[NSString stringWithFormat:@"%d",currentTag] forState:UIControlStateNormal];
 button.frame = CGRectMake(80*x, 32*y, 80, 32); 
 [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchUpInside];
 [buttonView addSubview: button];

Действие для кнопки

-(void)buttonPressed:(UIButton *)button
{
    NSLog(@"button %u -- frame: %@", button.tag, NSStringFromCGRect(button.frame));
    [self performSegueWithIdentifier:@"WeekView" sender:self];    
}

Подготовка к переходу МОЕ предупреждение

Сегменты, инициированные непосредственно из контроллеров представления, должны иметь идентификатор для использования с - [UIViewController performSegueWithIdentifier: sender:]

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"WeekView"]) {
        [segue.destinationViewController setTitle:@"WeekView"];
    }
}

person Community    schedule 21.06.2012    source источник
comment
Вы создаете Segue программно или в Интерфейсном Разработчике?   -  person geminiCoder    schedule 21.06.2012


Ответы (4)


Переходы, инициированные непосредственно из контроллеров представления, должны иметь идентификатор для использования с -[UIViewController performSegueWithIdentifier:sender:]

Это предупреждение возникает, когда вы перетаскиваете переход непосредственно из контроллера представления в раскадровке (иначе говоря, не с кнопки или любого элемента управления действием) и не вводите идентификатор (имя).

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

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

person Travis M.    schedule 11.10.2012
comment
Просто так неприятно взять на себя управление проектом с таким предупреждением - есть ли способ узнать, где в IB был сделан этот переход? - person powerj1984; 11.10.2013
comment
@ powerj1984 У меня тоже была эта проблема, когда я оглядывался на более старый проект. Мне пришлось нажимать на каждый сегмент раскадровки и проверять, исходит ли он из контроллера представления. Если да, то я даю ему идентификатор. Другое решение - получить помощь Xcode 5 для определения источника. - person XCool; 19.11.2013
comment
Совет от профессионалов: дважды щелкните предупреждение в раскадровке, и оно переместит вас к нарушителю. - person Adam Waite; 08.05.2014
comment
Также вы можете просмотреть предупреждение в файле журнала, и там должен быть идентификатор перехода. Затем вы просто открываете раскадровку как исходный код и cmd + f для этого идентификатора. - person Dannie P; 09.11.2014
comment
Спасибо @AdamWaite, я обновил свой ответ вашим комментарием. - person Travis M.; 21.09.2015
comment
У меня Xcode 8.0, и двойной щелчок открывает новое окно раскадровки. - person Adnan Asghar; 24.09.2016
comment
Вы правы, они изменили его на один клик. Я обновлю свой ответ. - person Travis M.; 26.09.2016
comment
У меня есть Xcode 8.0, и после нажатия на предупреждение он просто показывает раскадровку, но с Xcode 8.1 (GM) он показывает точный переход. - person Libor Zapletal; 26.10.2016
comment
На самом деле в Xcode 8.2.1 он просто бросает меня на раскадровку, а не на оскорбительный переход. - person Whirlwind; 13.01.2017
comment
Только для людей в 2019 году: Xcode 11.0 проходит почти такую ​​же ошибку и легко исправляется, щелкнув проблемный сегмент и указав его и идентификатор на вкладке атрибутов. - person Aus_10; 17.10.2019

Это решило мою проблему.

Перейдите в раздел Раскадровка> Проверить все переходы отношений Push или Pop.

Выберите каждое отношение перехода> Проверить свойства инспектора атрибутов> Раздел перехода раскадровки

В этом разделе укажите идентификатор для всех переходов.

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

person Kampai    schedule 28.07.2014

В Xcode 5 я убрал это предупреждение, назвав не только сегменты, но и контроллеры представления, к которым они ведут - каждому контроллеру представления нужен идентификатор раскадровки. Если вы назовете только сегменты, это (вводящее в заблуждение) предупреждение все равно появится.

person Adam Eberbach    schedule 30.10.2013

У меня было такое же предупреждение. Вы должны проверять каждый переход, если он имеет идентификатор, как сказал XCool.

Xcool - У меня тоже была эта проблема, когда я оглядывался на более старый проект. Мне пришлось нажимать на каждый сегмент раскадровки и проверять, исходит ли он из контроллера представления. Если да, то я даю ему идентификатор.

Также проверьте свои сегменты размотки! Это решило проблему для меня.

person manizzo    schedule 04.06.2014