Подтвердить что ты не робот

Вызовите сцену сценарной сцены программно (без необходимости segue)?

У меня есть модальная сцена для раскадровки, которую я хочу быть доступной ко всем моим другим сценам. Создание модального перехода к нему из каждой сцены на моей раскадровке создает большой беспорядок строк, идущих повсюду. Есть ли способ, который я оставляю без изменений и вызывать сцену программно?

В основном я хочу сделать что-то вроде этого:

  MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
  [self presentModalViewController:myNewVC animated:YES];

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

4b9b3361

Ответ 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

enter image description here Просто вызовите 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)