Подтвердить что ты не робот

Нажимать на другой контроллер представления без prepareForSegue

Как вы можете нажать на другой контроллер представления без prepareForSegue?

myClassVC *viewController = [myClassVC alloc];
UIStoryboardSegue *segue = [[UIStoryboardSegue alloc] initWithIdentifier:@"pushToMyVC" source:self destination:viewController];

if ([segue.identifier isEqualToString:@"pushToMyVC"]) {
 NSLog(@"logging");
 myClassVC *viewController = (myClassVC *)[segue destinationViewController];
 [self presentViewController:viewController animated:YES completion:nil];        
}
4b9b3361

Ответ 1

Если вы хотите программно вызвать push-сег, вы даете segue "идентификатор раскадровки" в Interface Builder, а затем вы можете:

[self performSegueWithIdentifier:"pushToMyVC" sender:self];

В качестве альтернативы, если вы не хотите выполнять segue, вы можете создать экземпляр контроллера представления назначения, а затем вручную нажать на этот контроллер представления. Все, что вам нужно сделать, это убедиться, что контроллер представления назначения имеет свой собственный "идентификатор раскадровки" в Interface Builder, затем вы можете:

UIViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"DestinationController"];
[self.navigationController pushViewController:controller animated:YES];

Вы сказали "толчок" (и, следовательно, я использовал pushViewController выше). Если вы действительно хотели "представить контроллер модального представления", то вторая строка:

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

Как вы можете видеть, вам не нужно использовать prepareForSegue для перехода к новой сцене. Вы используете только prepareForSegue, если хотите передать информацию контроллеру назначения. В противном случае это не нужно.

Ясно, что если вы не используете раскадровки (например, вы используете NIB), то процесс полностью отличается. Но я предполагаю, что вы не используете NIB, потому что prepareForSegue не применимо в этой среде. Но если вы используете NIB, это будет следующим:

SecondViewController *controller = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

Ответ 2

[self presentViewController:viewController animated:YES completion:nil]; не требуется, так как segue будет нажимать контроллер точки назначения с использованием выбранного вами перехода автоматически.

Если вы не хотите использовать процесс segue, вам нужно вручную нажать контроллер вида с помощью:

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

но сначала убедитесь, что вы удаляете segues в раскадровке.

Ответ 3

   NSString * storyboardName = @"Main";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewControllerID"];
    [self presentViewController:vc animated:YES completion:nil];

Ответ 4

В моем случае все viewControllers создаются динамически. Для этой цели я не использую раскадровку. Если это так, вы можете просто создать экземпляр класса viewController, который хотите открыть, и сделать нажатие, как в моем примере ниже:

MyViewController* myViewController = [[MyViewController alloc] init];
[self.navigationController pushViewController:myViewController animated:YES];