Как программно вызвать контроллер просмотра?
Я просмотрел все обучающие материалы, которые я могу найти на этом, и у меня все еще нет ответа. Мне нужно вызвать другое представление из кода. Я использую UIStoryboards
. Я несколько раз менял представление, перетаскивая элемент управления из UIButtons
, но теперь он должен быть из кода. Я пытаюсь вызвать информационную страницу из главного меню, если это первый раз, когда пользователь открыл приложение. Однако я не могу найти способ изменить представления из кода. Все мои представления контролируются одними и теми же файлами (ViewController2). identifier
моего главного меню ViewControllerMain, а identifier
информационной страницы ViewControllerInfo. Сначала я попробовал это:
[ViewControllerMain presentViewController: ViewControllerInfo
animated:YES
completion: NULL];
Затем я попытался сделать разные UIViewControllers
для каждого и сказать:
[ViewController2 presentViewController: ViewController
animated:YES
completion: NULL];
Ни один из них не работал. Для первого он говорит:
Использование незаявленного идентификатора ViewControllerMain.
Во втором, он говорит:
неожиданное имя интерфейса "ViewController": ожидаемый идентификатор.
Что я могу сделать?
Ответы
Ответ 1
Чтобы создать контроллер вида:
UIViewController * vc = [[UIViewController alloc] init];
Чтобы вызвать контроллер вида (должен быть вызван из другого диспетчера представлений):
[self presentViewController:vc animated:YES completion:nil];
Для одного используйте нуль, а не null.
Загрузка контроллера просмотра из раскадровки:
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
вашего контроллера просмотра либо равно имени класса вашего контроллера представлений, либо идентификатор раскадровки, который вы можете назначить в инспекторе идентификации вашей раскадровки.
Ответ 2
Вам нужно создать экземпляр контроллера представления из раскадровки, а затем показать его:
ViewControllerInfo* infoController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerInfo"];
[self.navigationController pushViewController:infoController animated:YES];
В этом примере предполагается, что у вас есть контроллер навигации, чтобы вернуться к предыдущему виду. Вы можете, конечно, также использовать presentViewController: анимированный: завершение:. Главное, чтобы ваша раскадровка создала ваш контроллер целевого представления, используя идентификатор контроллера целевого представления.
Ответ 3
Swift
Это получает контроллер просмотра из раскадровки и представляет его.
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewController(withIdentifier: "secondViewControllerId") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)
Измените имя раскадровки, имя контроллера контроллера и, при необходимости, проверьте идентификатор контроллера.
Ответ 4
Есть два способа сделать это:
1, создайте segue для вашего ViewController в вашей раскадровке, как описано в моем ответе здесь: Как выполнить сеанс, не связанный с вводом пользователя в iOS 5?
2, дайте свой ViewController и идентификатор и вызовите его, используя код в моем ответе здесь: Программный сценарий вызова сценария (без необходимости segue)?
Ответ 5
Вы можете вызвать 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 В загруженном виде: добавьте ниже в .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
Надеюсь, это будет полезно для кого-то там:)
Ответ 6
Основная логика этого: _,
NSString * storyboardIdentifier = @"SecondStoryBoard";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];
UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];
[self presentViewController:UIVC animated:YES completion:nil];
Ответ 7
Импортируйте класс контроллера вида, который вы хотите показать, и используйте следующий код
KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
Ответ 8
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];