Вызовите сцену сценарной сцены программно (без необходимости segue)?
У меня есть модальная сцена для раскадровки, которую я хочу быть доступной ко всем моим другим сценам. Создание модального перехода к нему из каждой сцены на моей раскадровке создает большой беспорядок строк, идущих повсюду. Есть ли способ, который я оставляю без изменений и вызывать сцену программно?
В основном я хочу сделать что-то вроде этого:
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
[self presentModalViewController:myNewVC animated:YES];
за исключением того, что вместо создания и нажатия класса контроллера представления я хочу сделать модальный переход к "изолированной" (не связанной с сценой) сценке.
Ответы
Ответ 1
Да, вы можете. Сделайте что-то подобное, чтобы получить доступ к VC, затем просто Modal Нажмите его:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
Ответ 2
Примечание: метод presentModalViewController: анимированный устарел в iOS 6.
Новый код должен выглядеть следующим образом:
NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[self presentViewController:controller animated:YES completion:nil];
Ответ 3
В раскадровке дайте вашему контроллеру просмотра идентификатор (в соответствии с Инспектором атрибутов), затем используйте следующий код, чтобы перенести это представление вперед.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
Ответ 4
У меня есть случай, когда я хочу представить контроллер представления из основной части приложения, один с настройками и справкой и так далее. Чтобы сделать это, я хочу, чтобы он находился в навигационном контроллере, вроде небольшого подключаемого модуля, который мы можем вызывать из UIBarButtonItem.
Теперь это может быть в/в текущей раскадровке или в другой, это не имеет значения.
Я хочу сделать это таким образом, потому что я ненавижу потенциал спагетти линии segue на всей моей раскадровке.
Вот как это сделать.
- (IBAction)displaySettings:(id)sender
{
LOG_SELECTOR() // google that for extra goodness
// FYI, this can be done using a different storyboard like so.
/*
NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
*/
// To push a new set of scenes with a new Navigation Controller, it is done like this:
UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
[settingsNC pushViewController:settingsVC animated:NO];
[settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
// Present the view controller;
[self presentViewController:settingsNC animated:YES completion:NULL];
}
В представленных контроллерах представления (или в подклассе контроллера навигации) вы можете иметь UIBarButtonItem, чтобы затем удалить всю представленную иерархию диспетчеров вида, например:
- (IBAction)dismissThisVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
Надеюсь, это поможет кучам людей. Приветствия.
Ответ 5
Просто вызовите viewcontroller с помощью контроллера навигации
Запишите этот код в viewcontroller и установите viewcontroller в раскадровку, как показано на изображении.
ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
[self.navigationController pushViewController:vc animated:YES];
Ответ 6
Вызов для перехода к другому классу
UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UINavigationController *navController = (UINavigationController *)window.rootViewController;
DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];
dump.isPushed=YES;
dump.strUserId = appDelegate.strFriendid;
[navController pushViewController:dump animated:YES];
Ответ 7
Вот такая версия:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let myVC = storyboard.instantiateViewControllerWithIdentifier("myStoryId")
self.presentViewController(myVC, animated: true, completion: nil)
Вы также должны изменить свой идентификатор раскадровки следующим образом:
![введите описание изображения здесь]()
Ответ 8
Я думаю, что с iOS7 стало очень легко внедряться через раскадровку
В настоящее время я изучаю новые функции в iOS7 и нашел это простое решение, но, возможно, это было актуально даже в предыдущих версиях, я не уверен.
Сначала вам нужно подключить презентацию VC с целевым VC (то есть единственное соединение, которое необходимо), тогда в инспекторе атрибутов раскадровки выберите стиль, который будет модальным, в инспекторе идентификации передайте свой VC сказочный файл и убедитесь, что вы проверили флажок "use storyboardID",
Если он еще не добавил этот метод к вашему представлению VC:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
YourTargetVC * targetVC =
(YourTargetVC *)segue.destinationViewController;
if(nil != targetVC) {
//Do preparations here
}
}
Теперь, когда вы хотите показать свой целевой VC из своего текущего VC, вы можете использовать:
[self performSegueWithIdentifier:(NSString *) sender:(id)];
где идентификатор - это ваш viewController storyboardID, а отправитель - это представление, которое вызвало действие, этот метод вызовет сцену раскадровки, поэтому будет вызван метод [prepareForSegue: sender:]
, позволяющий делать последние изменения до появления targetViewController.
Ответ 9
Версия Heres Swift 3:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)