it-swarm.com.ru

Как вызвать View Controller программно?

Я посмотрел все учебники, которые я могу найти на этом, и у меня до сих пор нет ответа. Мне нужно вызвать другой вид из кода. Я использую UIStoryboards. Я много раз менял представление путем перетаскивания элемента управления из UIButtons, но теперь оно должно быть из кода. Я пытаюсь вызвать информационную страницу из главного меню, если пользователь впервые открыл приложение. Однако я не могу найти способ изменить взгляды из кода. Все мои представления контролируются одними и теми же файлами ( ViewController2 ). identifier моего главного меню - ViewControllerMain , а identifier информационной страницы - ViewControllerInfo . Сначала я попробовал это:

[ViewControllerMain presentViewController: ViewControllerInfo 
                                 animated:YES 
                               completion: NULL];

Затем я попытался создать разные UIViewControllers для каждого и сказать:

[ViewController2 presentViewController: ViewController 
                              animated:YES 
                            completion: NULL];

Ни один не работал. Для первого он говорит:

Использование необъявленного идентификатора ViewControllerMain.

Во втором говорится:

неожиданное имя интерфейса 'ViewController': ожидаемый идентификатор.

Что я могу сделать?

61
John Farkerson

Чтобы создать контроллер представления:

UIViewController * vc = [[UIViewController alloc] init];

Для вызова контроллера представления (должен вызываться из другого viewcontroller):

[self presentViewController:vc animated:YES completion:nil];

Например, используйте ноль, а не ноль.


Загрузка контроллера представления из раскадровки:

NSString * storyboardName = @"MainStoryboard"; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];
[self presentViewController:vc animated:YES completion:nil];

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

126
190290000 Ruble Man

Вам нужно создать экземпляр контроллера представления из раскадровки и затем показать его:

ViewControllerInfo* infoController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerInfo"];
[self.navigationController pushViewController:infoController animated:YES];

В этом примере предполагается, что у вас есть контроллер навигации, чтобы вернуться к предыдущему виду. Конечно, вы также можете использовать presentViewController: animated: завершение :. Главное, чтобы ваша раскадровка создала экземпляр вашего целевого контроллера представления, используя идентификатор целевого контроллера представления.

20
tigloo

Стриж

Это получает контроллер представления из раскадровки и представляет его.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewController(withIdentifier: "secondViewControllerId") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)

Измените имя раскадровки, просмотр имени контроллера и просмотр идентификатора контроллера в зависимости от ситуации.

18
Suragch

Вы можете вызвать ViewController таким образом, если вы хотите с NavigationController

enter image description here

1. На текущем экране: загрузить новый экран

VerifyExpViewController *addProjectViewController = [[VerifyExpViewController alloc] init];
[self.navigationController pushViewController:addProjectViewController animated:YES];

2.1 В режиме загрузки: добавьте ниже в .h файл

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2 В Loaded View: добавить ниже в .m файл

  @implementation VerifyExpViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationController.delegate = self;
    [self setNavigationBar];
}
-(void)setNavigationBar
{
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.translucent = YES;
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"B_topbar.png"] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Btn_topback.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onBackButtonTap:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor lightGrayColor];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Save.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onSaveButtonTap:)];
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor lightGrayColor];
}

-(void)onBackButtonTap:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}
-(IBAction)onSaveButtonTap:(id)sender
{
    //todo for save button
}

@end

Надеюсь, что это будет полезно для кого-то там :)

5
swiftBoy

Есть 2 способа сделать это:

1. Создайте переход к вашему ViewController в раскадровке, как описано в моем ответе здесь: Как выполнить переход, не связанный с пользовательским вводом в iOS 5?

2. Дайте свой ViewController и идентификатор и назовите его, используя код в моем ответе здесь: Вызовите сцену раскадровки программно (без необходимости перехода)?

3
Darren

основная логика этого is_,

NSString * storyboardIdentifier = @"SecondStoryBoard";

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];

UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];

[self presentViewController:UIVC animated:YES completion:nil];
1
Vaibhav Shiledar
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_iOS7" bundle:nil];
            AccountViewController * controller = [storyboard instantiateViewControllerWithIdentifier:@"accountView"];
            //            [self presentViewController:controller animated:YES completion:nil];

        UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        while (topRootViewController.presentedViewController)
        {
            topRootViewController = topRootViewController.presentedViewController;
        }

        [topRootViewController presentViewController:controller animated:YES completion:nil];
0
suresh

Импортируйте класс контроллера представления, который вы хотите показать, и используйте следующий код

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
0
vijeesh