自定义Segue Pushing / Popping UIViewControllers

时间:2012-01-25 21:38:15

标签: ios ios5 storyboard segue

我正在尝试将类似iBooks的翻转过渡实现为故事板。 segue应该推动。将destinationViewController弹出到UINavigationControllers堆栈上。

我可以在我的segues perform方法中推送viewcontrollers,但我无法弹出。当我在创建翻转动画后立即弹出控制器时,动画不会运行,并且它的回调 - 应执行[[UIApplication sharedApplication] endIgnoringInteractionEvents]从未被调用,我的应用程序结果已经死亡。

所以我尝试在animationDidStop:anim:flag委托方法中推送/弹出,但是在标志设置为true的情况下永远不会调用它。

我假设在调用委托方法之前释放segue。我还能做什么?

2 个答案:

答案 0 :(得分:5)

如果我完全误解了这个问题,请原谅我,但似乎你只想在两个视图控制器之间来回做一个基本的水平翻转。即使你已经想到这一点,也许它会帮助其他有同样问题的人。

(1)在你的故事板(有ViewController A& B)中,从A到B创建一个模态Segue。给它一个标识符(showViewControllerB)并选择Transition:Flip Horizo​​ntal。

我们设置了协议并委托:

(2a)在ViewControllerB.h中添加@interface:

@class ViewControllerB;

@protocol ViewControllerBDelegate
    - (void)viewControllerBDidFinish:(ViewControllerB *)controller;
@end

(2b)将委托添加为属性:

@property (weak, nonatomic) id <ViewControllerBDelegate> delegate;

(3a)在ViewControllerB.m中合成:

@synthesize delegate;

(3b)并在方法中委托翻转:

- (IBAction)flipBack:(id)sender
{
    [self.delegate viewControllerBDidFinish:self];
}

(4)在ViewControllerA.h中,在最顶层#import "ViewControllerB.h"和@interface <ViewControllerBDelegate>

的末尾添加

(5a)在ViewControllerA.m中添加符合协议的方法:

- (void)viewControllerBDidFinish:(ViewControllerB *)controller
{
    [self dismissModalViewControllerAnimated:YES];
}

(5b)然后将其设置为prepareForSegue:

中的委托
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showViewControllerB"]) {
        [[segue destinationViewController] setDelegate:self];
    }
}

我希望这能回答你的问题。如果我误解了,请告诉我。

答案 1 :(得分:0)

你的问题有点令人困惑,因为混合弹出,推动,翻转和后空翻。我不确定ai是否可以回答你的问题,但我能说出我做了什么。

如果我将viewController推入导航控制器堆栈并将Storyboard Segue Style设置为Push,它将从右向左推入视图。出现一个后退按钮,并显示其中的presentsViewController的标题。

如果我将Storyboard Segue Style设置为Modal,我可以将Transition设置为Flip Horizo​​ntal(看起来像你想要的那样)。但是没有后退按钮会出现。在presentViewController中,我用以下方法关闭视图:

[self.presentingViewController dismissViewControllerAnimated:YES completion:nil];

它将向右翻转翻转第二个视图。

但这是一个肮脏的解决方案,并不是苹果推荐的。

http://developer.apple.com/library/ios/featuredarticles/ViewControllerPGforiPhoneOS/ManagingDataFlowBetweenViewControllers/ManagingDataFlowBetweenViewControllers.html#//apple_ref/doc/uid/TP40007457-CH8-SW9

Luke Dubert向您举例说明了如何实现委托。