【问题标题】:how to custom back button in storyboard如何在情节提要中自定义后退按钮
【发布时间】:2013-05-09 11:38:21
【问题描述】:

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

所以 ViewController2 用于下载,并具有 UILable 和 UIProgress 用于显示下载状态。如果此页面中不存在文件已下载并转到 ViewController3。

所以 ViewController3 用于显示文件。 (这些页面与底部的图片一样的 push segue 连接在一起)

当我转到任何页面并单击返回按钮返回上一页时,对吗? 我什么时候点击第一页的按钮并且文件不存在并且在第二页下载然后完成下载转到第 3 页。现在我想什么时候点击第 3 页中的返回按钮转到第 1 页没有第 2 页!!!!!!

我要在故事板中工作。

【问题讨论】:

    标签: ios objective-c uiviewcontroller storyboard


    【解决方案1】:

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

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

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

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

    2) 在情节提要中缩小,然后从 ViewController3 按住 ctrl 并拖动到 ViewController3 场景中左侧的“退出”绿色框(以及红色框 First Responder 和所有控制器视图的子视图)。将显示一个弹出窗口,询问您要将 unwind segue 连接到哪个 IBAction,您应该能够选择刚刚创建的 unwindToThisViewController 操作。这将创建一个 unwind 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 及更高版本上支持展开转场,如果您在早期版本的 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.
    }
    

    【讨论】:

    • 您也可以在不缩小的情况下实现第 2 步,方法是从视图下方的黄色圆圈按住 ctrl 拖动到绿色的退出符号方块,或者您甚至可以在左侧的场景框中完成所有操作!
    • 请参阅my gist,了解如何在 Swift 中为 XCode 6 编写 viewWillDisappear 方法。
    猜你喜欢
    • 2015-04-09
    • 2013-05-02
    • 1970-01-01
    • 2019-12-05
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多