UIViewController转换 – objective-c

我有UIViewControllers A和B,它们在AppDelegate中分配。 我需要对它们进行过渡。 如何在不重新分配和替换UIViews情况下传输它们? 此代码从UINavigationController UIBarButtonItem调用:

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

这个方法取代了我的UIViewControllers ,我可以将它们传回,或者只是不知道如何做到这一点。 你能告诉我怎么做吗?

如果您处于iOS 5世界并希望在各种视图控制器之间跳转,则可能需要追求View Controller Containment 。 或者查看WWDC 2011会议102 。

视图控制器包含基本上假设您有一些父视图控制器,它控制多个子控制器之间的导航。 在您的情况下,父视图将是带有导航栏的按钮,其中包含按钮。

更新:

如果你追求遏制,你可以创建一个父视图控制器,它有一个带有按钮的导航栏。 加载该视图时,可以添加第一个子视图。 因此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只进行最终配置。 为了方便起见,我经常会有一个我在IB中设置的UIView(在本例中称为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中的一项新function。 上面提供的链接提供了一些代码和github项目的链接。

祝你好运

Ť

我找到了解决问题的方法。 此代码适用于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];