По определению, сегмент не может существовать независимо от раскадровки. Это даже там, во имя класса UIStoryboardSegue
. Вы не создаете сегменты программно - это среда раскадровки, которая создает их для вас. Обычно вы можете вызывать performSegueWithIdentifier:
код контроллера представления, но это зависит от того, будет ли уже настроен переход в раскадровке для ссылки.
Однако я думаю, что вы спрашиваете, как вы можете создать метод в вашем общем контроллере представления (базовый класс), который перейдет к новому контроллеру представления и будет унаследован всеми производными классами. Вы можете сделать это, создав такой метод для вашего контроллера представления базового класса:
- (IBAction)pushMyNewViewController
{
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
// do any setup you need for myNewVC
[self presentModalViewController:myNewVC animated:YES];
}
и затем в своем производном классе вызовите этот метод, когда нажата соответствующая кнопка или выбрана строка таблицы или что-то еще.
UIViewController
метод, названныйperformSegueWithIdentifier:sender:
для этого.UIView
«spresentModalViewController:animated:
является устаревшим. Из документов - (Устаревший в iOS 6.0. Используйте presentViewController: animated: завершение: вместо.)Я думал, что добавлю еще одну возможность. Одна из вещей, которую вы можете сделать, - вы можете соединить две сцены в раскадровке, используя переход, который не привязан к действию, а затем программно запустить переход внутри вашего контроллера представления. Для этого вам нужно перетащить значок владельца файла в нижней части сцены раскадровки, являющейся сценой перехода, и перетащить вправо к целевой сцене. Я добавлю изображение, чтобы помочь объяснить.
Появится всплывающее окно «Ручной переход». Я выбрал Push как тип. Нажмите на маленький квадрат и убедитесь, что вы находитесь в инспекторе атрибутов. Дайте ему идентификатор, который вы будете использовать для ссылки на него в коде.
Хорошо, теперь я собираюсь перейти с помощью кнопки панели инструментов. В viewDidLoad или в другом месте я создам элемент кнопки на панели навигации с таким кодом:
Хорошо, обратите внимание, что селектор - buttonizeButtonTap :. Поэтому напишите метод void для этой кнопки, и внутри этого метода вы будете вызывать segue следующим образом:
Параметр sender необходим для идентификации кнопки при вызове prepareForSegue. prepareForSegue - это метод фреймворка, в котором вы создадите экземпляр своей сцены и передадите ей все значения, которые понадобятся для ее работы. Вот как выглядит мой метод:
Хорошо, только что проверил, и это работает. Надеюсь, это поможет вам.
источник
Я использовал этот код для создания своего собственного подкласса segue и запуска его программно. Вроде работает. Что-то не так с этим? Я озадачен, читая все остальные ответы о том, что это невозможно.
источник
UIStoryboardSegue
.performSegueWithIdentifier:
действительно определен в раскадровке. Я избегаю всех проблем, если я создаю Segue самостоятельно.Полагаю, что на это ответили и приняли, но я просто хотел бы добавить еще несколько деталей.
Что я сделал, чтобы решить проблему, когда я представлял вид входа в систему в качестве первого экрана, а затем хотел перейти к приложению, если вход был правильным. Я создал переход от контроллера входа в систему к корневому контроллеру представления и дал ему идентификатор типа «myidentifier».
Затем, проверив весь код входа в систему, если логин был правильным, я позвоню
Мое самое большое недоразумение заключалось в том, что я пытался переключить переход и как бы прервать переход, как только он был найден.
источник
Вы должны связать свой код с тем,
UIStoryboard
который вы используете. Убедитесь, что вы входите в YourViewController в вашемUIStoryboard
, нажмите на границу вокруг него, а затем установите егоidentifier
поле в то,NSString
что вы вызываете в своем коде.источник
Для контроллеров, которые находятся в раскадровке.
jhilgert00 это то, что вы искали?
ИЛИ...
источник
ну, вы можете создать, а также можете создать подкласс UIStoryBoardSegue. Подклассы в основном используются для создания пользовательской анимации перехода.
Вы можете посмотреть видео с wwdc 2011, представляющего StoryBoard. его также доступны в YouTube.
http://developer.apple.com/library/ios/#documentation/UIKit/Reference/UIStoryboardSegue_Class/Reference/Reference.html#//apple_ref/occ/cl/UIStoryboardSegue
источник
Я хотел бы добавить уточнение ...
Распространенное недоразумение, фактически то, которое у меня было некоторое время, заключается в том, что
prepareForSegue:sender:
метод раскадровки вызывается этим методом. Это не. Seguard будет работать независимо от того, реализовали ли выprepareForSegue:sender:
метод для этого (отклоняющегося) контроллера представления.Я узнал об этом из отличных лекций iTunesU Пола Хегарти . Мои извинения, но, к сожалению, не могу вспомнить, какую лекцию.
Если вы соединяете переход между двумя контроллерами представления в раскадровке, но не реализуете
prepareForSegue:sender:
метод, переход все равно перейдет к целевому контроллеру представления. Однако это приведет к тому, что контроллер представления не подготовлен.Надеюсь это поможет.
источник
Сегменты раскадровки не должны создаваться вне раскадровки. Вам нужно будет подключить его, несмотря на недостатки.
Справочник UIStoryboardSegue четко гласит:
Вы все еще можете программно сказать раскадровке представить контроллер представления с помощью segue, используя
presentModalViewController:
илиpushViewController:animated:
вызовы, но вам понадобится экземпляр раскадровки.Вы можете вызвать
UIStoryboard
метод класса s, чтобы получить именованную раскадровку с пакетом nil для основного пакета.storyboardWithName:bundle:
источник
Во-первых, предположим, что у вас есть два разных представления в раскадровке, и вы хотите перемещаться с одного экрана на другой, поэтому выполните следующие действия:
1). Определите все ваши представления с помощью файла класса, а также идентификатора раскадровки в инспекторе идентичности.
2). Убедитесь, что вы добавили контроллер навигации к первому виду. Выберите его в раскадровке, а затем выберите «Редактор»> «Встроить»> «Контроллер навигации».
3). В свой первый класс импортируйте «secondClass.h»
4). Добавьте эту команду в IBAction, который должен выполнить переход
5).
@"second"
класс контроллера secondview, идентификатор раскадровки.источник
self.storyboard
должно быть:UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
storyboardWithName:@"Main"
[self showDetailViewController:next sender:self];
или[self showViewController:next sender:self];
Я пересмотрел проект и сделал (-и) реализацию сегментов UIStoryboard с открытым исходным кодом: https://github.com/acoomans/Segway
С помощью этой библиотеки вы можете определять сегменты программно (без раскадровки).
Надеюсь, это может помочь.
источник
На самом деле пара проблем:
Во-первых, в этом проекте, который вы загрузили для нас, segue не имеет идентификатора "segue1":
без идентификатора
Вы должны заполнить этот идентификатор, если вы еще этого не сделали.
Во-вторых, когда вы переходите от представления таблицы к представлению таблицы, вы вызываете initWithNibName, чтобы создать контроллер представления. Вы действительно хотите использовать instantiateViewControllerWithIdentifier.
источник
Вот пример кода для
Creating a segue programmatically
:источник
self.prepare(for: self.commonSegue, sender: self)
с вашего метода действия. Тогда какой смысл сравниватьif self.commonSegue == segue {...}
вprepare(for:sender)
методе?prepare(for:sender:)
, вы можете настроить контроллер представления назначения до его отображения. Конечно, вы также можете сделать это вactionFunction
.