Вопрос по swift3, storyboard, uiviewcontroller, swift – Как я могу переключать представления программно в контроллере представления? (Xcode, iPhone)

42

Некоторое время боролся с этим и никогда не получал прямого ответа.

Любая помощь приветствуется!

Ваш Ответ

11   ответов
1
[self.navigationController pushViewController:someViewController animated:YES];
Это не работает для меня, имеет ли значение, что я делаю это в tableView: didSelectRowAtIndexPath: метод? mishajw126
2

NSTimer *switchTo = [NSTimer scheduledTimerWithTimeInterval:0.1
           target:selfselector:@selector(switchToTimer)userInfo:nil repeats:NO];

- (void) switchToTimer {
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPad" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"MyViewControllerID"]; // Storyboard ID
[self presentViewController:vc animated:FALSE completion:nil];
}
3
#import "YourViewController.h"

включая панель навигации и / или панель вкладок:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil];
YourViewController *viewController = (YourViewcontroller *)[storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerIdentifier"];
[self.navigationController pushViewController:viewController animated:YES];

Чтобы установить идентификатор для контроллера представления, откройте YourStoryboard.storyboard. Выберите YourViewController View- & gt; Утилиты - & gt; ShowIdentityInspector. Там вы можете указать идентификатор.

Последнее предложение не относится к Xcode 10 из-за изменений в UX.
17

instantiateViewControllerWithIdentifier этоStoryboard ID.

thIdentifier:@"NextViewController"];
[self presentViewController:NVC animated:YES completion:nil];
16

Swift версия:

If you are in a Navigation Controller:

let viewController: ViewController = self.storyboard?.instantiateViewControllerWithIdentifier("VC") as ViewController
self.navigationController?.pushViewController(viewController, animated: true)

Or if you just want to present a new view:

let viewController: ViewController = self.storyboard?.instantiateViewControllerWithIdentifier("VC") as ViewController
self.presentViewController(viewController, animated: true, completion: nil)
33

В CurrentViewController.m,

#import "YourViewController.h"

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
YourViewController *viewController = (YourViewController *)[storyboard instantiateViewControllerWithIdentifier:@"YourViewControllerIdentifier"];
[self presentViewController:viewController animated:YES completion:nil];

Чтобы установить идентификатор для контроллера представления, Откройте MainStoryBoard.storyboard. Выберите YourViewController Просмотр- & GT; Утилиты - & gt; ShowIdentityInspector. Там вы можете указать идентификатор.

хорошо, если раскадровка называется Main.Storyboard, вам нужно поставить просто @ & quot; Main & quot; вместо @ & quot; Main.storyboard & quot;
Это выдвигает непрерывные представления, пока я нажимаю строку в ячейке DynamicTableView, например: [ссылка]stackoverflow.com/questions/19329723/ipad-masterdetail-template
0

что ОП спрашивает, как поменять VIEW без изменения viewCONTROLLERs. Я неправильно понимаю его вопрос?

В псевдокоде он хочет сделать:

let myController = instantiate (someParentController)

пусть view1 = Bundle.main.loadNib (....) как ... бла myController.setThisViewTo (view1)

let view2 = Bundle.main.loadNib (....) как ... бла myController.setThisViewTo (view2)

Я неправильно понял его вопрос?

4

Swift 3.0 Version

если вы хотите представить новый контроллер.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "controllerIdentifier") as! YourController
self.present(viewController, animated: true, completion: nil)

и если вы хотите нажать на другой контроллер (если он находится в навигации)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "controllerIdentifier") as! YourController
self.navigationController?.pushViewController(viewController, animated: true)
Идентификатор = идентификатор раскадровки. Чтобы установить идентификатор, выберите контроллер представления в раскадровке & gt; Инспектор идентификации & gt; ID раскадровки под Идентификацией.
5

вызванный с кодом предыдущего ответа CmdSft

    ViewController *viewController = [[ViewController alloc] init];    
    [self presentViewController:viewController animated:YES completion:nil];

ты можешь использовать

    [self dismissViewControllerAnimated:YES completion: nil];
1

Swift 3.0 in

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

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "MsgViewController") as! MsgViewController
        self.navigationController?.pushViewController(loginVC, animated: true)

Контроллер второго вида на контроллер первого вида (назад) для:back button on action event:-

self.navigationController?.popViewController(animated:true)

3-й вид контроллера на 1-й вид контроллера перейдет к

self.navigationController?.popToRootViewController(animated:true)

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

86

ViewController *viewController = [[ViewController alloc] init];
[self.navigationController pushViewController:viewController animated:YES];

или если вы просто хотите представить новый вид:

ViewController *viewController = [[ViewController alloc] init];    
[self presentViewController:viewController animated:YES completion:nil];
Обновлено, чтобы отразить их.
Просто отметить, чтоpresentModalViewController:animated: помечен как устаревший вUIViewController docs. presentViewController:animated:completion: следует использовать вместо
@Rob. Код строки [self.storyboard instantiateViewControllerWithIdentifier @: & quot; идентификатор раскадровки & quot;]; выполнить несколько раз, тогда каждый раз создается новый * VC объект? как насчет ранее * VC объекта? это утечка памяти?
Я просто на этот вопрос, если я буду использовать второе решение, смогу ли я вернуться к предыдущему виду, и как?
Излишне говорить, что теперь вы редко создаете экземпляры контроллеров представления, вызываяalloc а такжеinit, С раскадровками вы используете[self.storyboard [email protected]:"storyboard id"], Или, если вы используете раскадровки с segue, вы просто выполняете переход непосредственно с[self performSegueWithIdentifier:@"storyboard id" sender:self];, который будет одновременно создавать новый контроллер представления и переходить к нему одним махом. И если используются NIB, если имя NIB отличается, вы создаете экземпляр контроллера представления с помощью[[NSBundle mainBundle] loadNibNamed:@"nibname" owner:self options:nil].

Похожие вопросы