iOS: представить контроллер представления программно
Я использую метод presentViewController:animated:completion:
для перехода к другому контроллеру представления.
Это мой код:
AddTaskViewController *add = [[AddTaskViewController alloc] init];
[self presentViewController:add animated:YES completion:nil];
Этот код переходит к другому UIViewController
, но другой контроллер пуст. Я всегда использовал раскадровки, но теперь мне нужно, чтобы это было сделано в коде.
Ответы
Ответ 1
Если вы используете раскадровку, вы, вероятно, не должны использовать alloc
и init
для создания нового контроллера представлений. Вместо этого посмотрите на свою раскадровку и найдите сегу, которую вы хотите выполнить; он должен иметь уникальный идентификатор (а если нет, вы можете установить его на правой боковой панели).
После того, как вы найдете идентификатор для этого сеанса, отправьте текущему контроллеру представления сообщение -performSegueWithIdentifier:sender
:
[self performSegueWithIdentifier:@"mySegueIdentifier" sender:self];
Это заставит раскадровку создать экземпляр AddTaskViewController и представить его так, как вы определили для этого сеанса.
Если, с другой стороны, вы вообще не используете раскадровку, вам нужно дать вашему AddTaskViewController какой-то пользовательский интерфейс. Наиболее распространенный способ сделать это - инициализировать контроллер с помощью nib: вместо вызова init
вы вызовете -initWithNibName:bundle:
и укажите имя файла .xib, который содержит ваш пользовательский интерфейс с добавленной стоимостью:
AddTaskViewController *add = [[AddTaskViewController alloc]
initWithNibName:@"AddTaskView" bundle:nil];
[self presentViewController:add animated:YES completion:nil];
(Существуют и другие (менее распространенные) способы получения представления, связанные с вашим новым контроллером представлений, но это, вероятно, будет иметь наименьшую проблему для работы.)
Ответ 2
Если вы используете Storyboard и ваш "add" viewController находится в раскадровке, тогда установите параметры для вашего "add" viewcontroller в настройках, чтобы вы могли сделать что-то вроде этого:
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard"
bundle:nil];
AddTaskViewController *add =
[storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];
[self presentViewController:add
animated:YES
completion:nil];
если у вас нет вашего "add" viewController в раскадровке или файле nib и вы хотите создать все это программно, тогда appDocs говорит:
Если вы не можете определить свои представления в раскадровке или файле nib, переопределите метод loadView, чтобы вручную создать иерархию представления и присвоить ее свойству вида.
Ответ 3
Вам нужно установить идентификатор раскадровки из инспектору идентификации раскадровки
AddTaskViewController *add=[self.storyboard instantiateViewControllerWithIdentifier:@"storyboard_id"];
[self presentViewController:add animated:YES completion:nil];
Ответ 4
ваш код:
AddTaskViewController *add = [[AddTaskViewController alloc] init];
[self presentViewController:add animated:YES completion:nil];
этот код может перейти на другой контроллер, но вы получаете новый viewController, а не контроллер вашего раскадровки, вы можете сделать вот так:
AddTaskViewController *add = [self.storyboard instantiateViewControllerWithIdentifier:@"YourStoryboardID"];
[self presentViewController:add animated:YES completion:nil];
Ответ 5
Лучший способ -
AddTaskViewController * add = [self.storyboard instantiateViewControllerWithIdentifier:@"addID"];
[self presentViewController:add animated:YES completion:nil];
Ответ 6
Вот как вы можете это сделать в Swift:
let vc = UIViewController()
self.presentViewController(vc, animated: true, completion: nil)
Ответ 7
Попробуйте следующее:
NextViewController *nextView = [self.storyboard instantiateViewControllerWithIdentifier:@"nextView"];
[self presentViewController:nextView animated:YES completion:NULL];
Ответ 8
Попробуйте этот код:
[self.navigationController presentViewController:controller animated:YES completion:nil];
Ответ 9
LandingScreenViewController *nextView=[self.storyboard instantiateViewControllerWithIdentifier:@"nextView"];
[self presentViewController:nextView animated:YES completion:^{}];