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

Comments