如何在故事板中自定义后退按钮

时间:2013-05-09 11:38:21

标签: ios objective-c uiviewcontroller storyboard

我创建了一个具有3个带有名称的ViewController的应用程序:(ViewController,ViewController2,ViewController3) 在ViewController中存在一个按钮,用于检查文件夹中的文件或下载它。例如,首先检查文件文件夹中是否存在文件夹转到ViewController3,否则转到ViewController2并下载它。

所以ViewController2是供下载的,有UILable& UIProgress for show download status.if文件不存在于此页面下载并转到ViewController3。

所以ViewController3用于show文件。 (这些页面与push segue连接在一起,就像我在底部的图像一样)

当我去任何页面时,我点击后退按钮返回上一页右边? 我何时点击第一页上的按钮并且文件不存在并在第二页下载然后完成下载转到第3页。现在我想要点击第3页的后退按钮转到第1页没有第2页!!!! < / p>

我在故事板上工作。

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以通过截取ViewController3中的后退按钮事件并使用unwindSegues来实现此目的。 查看William Jockusch对此question的回复,了解如何拦截后退按钮事件。

要在这种特殊情况下使用展开segues,您需要:

1)在ViewController1中创建一个方法,如

- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
    NSLog(@"Rolled back");
}

2)在你的故事板中缩小,然后从ViewController3中按住Ctrl键拖动到ViewController3场景中左侧的“Exit”绿色框(以及红色框First Responder和所有控制器视图的子视图)。将显示一个弹出窗口,询问您要将unwind segue连接到哪个IBAction,您应该能够选择刚刚创建的unwindToThisViewController操作。这将创建一个放松的segue。

3)从场景框中选择此展开segue并为其指定ID,例如“unwindToStart”

4)最后,在ViewController3类中,重写方法viewWillDisappear,如下所示:

-(void) viewWillDisappear:(BOOL)animated 
{
    if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound)
        [self performSegueWithIdentifier:@"unwindToStart" sender:self];
    [super viewWillDisappear:animated];
}

这会拦截后退按钮事件并展开到你的ViewController1,你就可以了。

编辑:由于仅在iOS 6及更高版本上支持展开segue,如果您在早期版本的iOS上需要此功能,我认为唯一的方法是从ViewController3的viewDidLoad中的NavigationController堆栈中手动删除ViewController2。类似下面的代码应该做:

- (void)viewDidLoad
{   
    NSMutableArray *viewControllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
    for(UIViewController* vc in self.navigationController.viewControllers)
    {
        if ([vc isKindOfClass:[ViewController2 class]]) {
            [viewControllers removeObject:vc];
            break;
        }
    }
    self.navigationController.viewControllers = [NSArray arrayWithArray:viewControllers];
    // Do any additional setup after loading the view.
}