it-swarm.com.ru

iOS: представить контроллер представления программно

Я использую метод presentViewController:animated:completion:, чтобы перейти к другому контроллеру представления.

Это мой код:

AddTaskViewController *add = [[AddTaskViewController alloc] init];
[self presentViewController:add animated:YES completion:nil];

Этот код переходит к другому UIViewController, но другой контроллер пуст. Я всегда использовал раскадровки, но теперь мне нужно, чтобы это было сделано в коде.

32
Salieh

Если вы используете раскадровку, вам, вероятно, не следует использовать alloc и init для создания нового контроллера представления. Вместо этого посмотрите на свою раскадровку и найдите segue , который вы хотите выполнить; он должен иметь уникальный идентификатор (а если нет, вы можете установить его в правой боковой панели).

Найдя идентификатор для этого перехода, отправьте вашему current view контроллеру сообщение -performSegueWithIdentifier:sender:

[self performSegueWithIdentifier:@"mySegueIdentifier" sender:self];

Это заставит раскадровку создать экземпляр AddTaskViewController и представить его так, как вы определили для этого перехода.


Если, с другой стороны, вы вообще не используете раскадровку, то вам нужно предоставить вашему AddTaskViewController своего рода пользовательский интерфейс. Наиболее распространенный способ сделать это - инициализировать контроллер с помощью пера: вместо простого вызова init, вы будете вызывать -initWithNibName:bundle: и предоставить имя .xib-файла, который содержит ваш пользовательский интерфейс надстройки:

AddTaskViewController *add = [[AddTaskViewController alloc]
                              initWithNibName:@"AddTaskView" bundle:nil];
[self presentViewController:add animated:YES completion:nil];

(Существуют другие (менее распространенные) способы получения представления, связанного с вашим новым контроллером представления, но это, вероятно, представит вам наименьшую проблему при работе.)

46
Tim

Если вы используете раскадровку и ваш «добавить» viewController находится в раскадровке, тогда установите идентификатор для своего «добавления» viewcontroller в настройках, чтобы вы могли сделать что-то вроде этого:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"NameOfYourStoryBoard" 
                                                     bundle:nil];
AddTaskViewController *add = 
           [storyboard instantiateViewControllerWithIdentifier:@"viewControllerIdentifier"];

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

если у вас нет своего «добавления» viewController в раскадровке или в nib-файле и вы хотите создать все это программно, тогда appDocs говорит:

Если вы не можете определить свои представления в раскадровке или файле пера, переопределите метод loadView, чтобы вручную создать экземпляр иерархии представления и назначить его свойству представления.

31
Leg1oneR

Вам нужно установить идентификатор раскадровки из инспектора идентификации раскадровки

 AddTaskViewController *add=[self.storyboard instantiateViewControllerWithIdentifier:@"storyboard_id"];
 [self presentViewController:add animated:YES completion:nil];
2
Rajesh Gupta

ваш код :

 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];
1
klone

Лучший способ это

AddTaskViewController * add = [self.storyboard instantiateViewControllerWithIdentifier:@"addID"];
[self presentViewController:add animated:YES completion:nil];
1
Sahidul Islam

Попробуйте этот код:

[self.navigationController presentViewController:controller animated:YES completion:nil];
0
Oshitha Wimalasuriya

Попробуйте следующее:

NextViewController *nextView = [self.storyboard instantiateViewControllerWithIdentifier:@"nextView"];
[self presentViewController:nextView animated:YES completion:NULL];
0
MNIDR