Как вызвать контроллер вида программно?



Я посмотрел на все учебники, которые я могу найти на этом, и у меня до сих пор нет ответа. Мне нужно вызвать другой вид кода. Я использую UIStoryboards. Я изменил представление много раз путем управления перетаскиванием из UIButtons, но теперь это должно быть из кода. Я пытаюсь вызвать информационную страницу из главного меню, если это первый раз, когда пользователь открыл приложение. Однако я не могу найти способ изменить представления из кода. Все мои взгляды контролируются одним и тем же файлы (ViewController2). Элемент identifier из моего главного меню ViewControllerMain и identifier инфо-страницы ViewControllerInfo. Сначала я попробовал это:



[ViewControllerMain presentViewController: ViewControllerInfo 
animated:YES
completion: NULL];


тогда я попробовал сделать по-другому UIViewControllers для каждого и говорил:



[ViewController2 presentViewController: ViewController 
animated:YES
completion: NULL];


ни один не работал. Для первого, он говорит:




использование необъявленного идентификатора ViewControllerMain.




во втором, он говорит:




неожиданное имя интерфейса 'ViewController': ожидаемый идентификатор.




что я могу сделать?

610   8  

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

enter image description here

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

    Ничего не найдено.