Переход UIViewController – цель-c

У меня есть UIViewControllers A и B, они выделены в AppDelegate . Мне нужно применить переход к ним. Как их UIViews без перераспределения и замены UIViews ? Этот код вызывает мой UIBarButtonItem в UINavigationController :

 [UIView transitionFromView:self.view //UIViewController A toView:appDelegate.secondViewController.view //UIViewController B duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft 

Этот метод заменяет UIViews в моих UIViewControllers , и я могу их переправить или просто не знаю, как это сделать. Можете ли вы рассказать мне, как это сделать?

Если вы находитесь в мире iOS 5 и хотите прыгать между различными контроллерами, вы можете захотеть использовать Containment View Controller . Или проверьте сессию 102 WWDC 2011 .

Просмотр содержимого контроллера в основном предполагает, что у вас есть контроллер родительского представления, который управляет навигацией между несколькими дочерними контроллерами. В вашем случае родительское представление будет одно с панелью навигации с кнопкой на нем.

Обновить:

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

 - (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let's create our first view controller OneViewController *controller = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; // pass it our model (obviously, `model` is a property that I've set up in my child controllers) controller.model = _model; // let's put the new child in our container and add it to the view [self addChildViewController:controller]; [self configureChild:controller]; [self.view addSubview:controller.view]; [controller didMoveToParentViewController:self]; // update our navigation bar title and the label of the button accordingly [self updateTitles:controller]; } 

configureChild выполняет окончательную настройку. Для удобства у меня часто будет UIView, который я установил в IB (в данном случае, с именем childView ), который я использую для настройки фрейма, который выводит меня из мира ручного создания фреймов, но вы можете сделать это любым способом:

 - (void)configureChild:(UIViewController *)controller { // configure it to be the right size (I create a childView in IB that is convenient for setting the size of the views of our child view controllers) controller.view.frame = self.childView.frame; } 

Это действие, если вы касаетесь кнопки на панели навигации. Если вы находитесь в первом контроллере, настройте второй контроллер. Если вы находитесь во втором контроллере, настройте первый:

 - (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *currentChildController = [self.childViewControllers objectAtIndex:0]; if ([currentChildController isKindOfClass:[OneViewController class]]) { TwoViewController *newChildController = [[TwoViewController alloc] initWithNibName:@"TwoViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else if ([currentChildController isKindOfClass:[TwoViewController class]]) { OneViewController *newChildController = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; newChildController.model = _model; [self transitionFrom:currentChildController To:newChildController]; } else NSAssert(FALSE, @"Unknown controller type"); } 

Это делает основной переход (включая различные вызовы, связанные с защитой):

 - (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self addChildViewController:newController]; [self configureChild:newController]; [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ [oldController willMoveToParentViewController:nil]; [oldController removeFromParentViewController]; [newController didMoveToParentViewController:self]; }]; } 

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

 - (void)updateTitles:(UIViewController *)controller { if ([controller isKindOfClass:[OneViewController class]]) { self.navigationItemTitle.title = @"First View Controller"; // current title self.barButton.title = @"Two"; // title of button to take me to next controller } else if ([controller isKindOfClass:[TwoViewController class]]) { self.navigationItemTitle.title = @"Second View Controller"; // current title self.barButton.title = @"One"; // title of button to take me to next controller } else NSAssert(FALSE, @"Unknown controller type"); } 

Все это предполагает, что вы собираетесь создавать и уничтожать контроллеры при переходе между ними. Обычно я это делаю, но использую модельный объект для хранения своих данных, поэтому сохраняю любые данные, которые я хочу.

Вы сказали, что не хотите делать это «без перераспределения и замены UIViews»: если это так, вы также можете изменить приведенный выше код для создания обоих контроллеров детского представления вверх и изменить переход, чтобы просто прыгать между ними:

 - (void)viewDidLoad { [super viewDidLoad]; // this is my model, where I store data used by my view controllers _model = [[MyModel alloc] init]; // let's create our first view controller _controller0 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller0.model = _model; [self addChildViewController:_controller0]; [self configureChild:_controller0]; [_controller0 didMoveToParentViewController:self]; // let's create our second view controller _controller1 = [[OneViewController alloc] initWithNibName:@"OneViewController" bundle:nil]; _controller1.model = _model; [self addChildViewController:_controller1]; [self configureChild:_controller1]; [_controller1 didMoveToParentViewController:self]; // let's add the first view and update our navigation bar title and the label of the button accordingly _currentChildController = _controller0; [self.view addSubview:_currentChildController.view]; [self updateTitles:_currentChildController]; } - (void)transitionFrom:(UIViewController *)oldController To:(UIViewController *)newController { [self transitionFromViewController:oldController toViewController:newController duration:0.5 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{ [self updateTitles:newController]; } completion:^(BOOL finished){ _currentChildController = newController; }]; } - (IBAction)barButtonTouchUpInside:(id)sender { UIViewController *newChildController; if ([_currentChildController isKindOfClass:[OneViewController class]]) { newChildController = _controller1; } else if ([_currentChildController isKindOfClass:[TwoViewController class]]) { newChildController = _controller0; } else NSAssert(FALSE, @"Unknown controller type"); [self transitionFrom:_currentChildController To:newChildController]; } 

Я видел это в обоих направлениях, поэтому вы можете делать то, что работает для вас.

посмотрите пожалуйста. Вы в основном хотите реализовать UIViewController, которая является новой функцией в iOS5. Приведенная выше ссылка предоставляет некоторый код и ссылку на проект github.

Удачи

T

Я нашел решение для своей проблемы. Этот код работает на iOS 4.x

 [UIView beginAnimations:@"transition" context:nil]; [UIView setAnimationDuration:1.0]; [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.navigationController.view cache:NO]; [self.navigationController pushViewController:self.alternateView animated:NO]; [UIView commitAnimations]; 

пытаться

 UIViewController* controller1; UIViewController* controller2; [controller1 transitionFromViewController:controller1 toViewController:controller2 duration:0.5f options:0 animations:nil completion:nil]; 

или

если над навигатором-контроллером1, то

 UINavigationController* nav; [nav pushViewController:controller2 animated:YES]; 
  • Предупреждение. Попытайтесь представить <GuessMeFinal> в <GuessMeFinal.ViewController>, чей вид не находится в иерархии окон -Swift
  • UIButton на всех страницах UIPageViewController
  • Обновить UIwebview без какого-либо тряски?
  • UIPercentDrivenInteractiveTransition не доходит до завершения анимации быстрым жестом
  • Потеря ссылки на переход на предыдущую презентацию перед представлением предвыборки
  • Удаление диспетчеров просмотра из стека навигации
  • Программно добавление UITableView - как установить идентификатор повторного использования для ячеек?
  • self.navigationController pushViewController не добавляет контроллер в стек
  • Почему я не могу нажать новый контроллер просмотра на текущий вид?
  • ios, получая указатель на контроллер с точки зрения
  • edgeForExtendedLayout игнорируется на iOS9 при использовании пользовательской анимации
  • Давайте будем гением компьютера.