用户执行操作后,切换到不同选项卡中的视图控制器

时间:2014-09-30 15:50:29

标签: ios objective-c iphone

我正在处理的应用程序中有以下故事板:

View of my storyboard

在根目录中,我有一个标签栏控制器。它链接到两个视图控制器。

第一个视图控制器,用于显示用户上传的图片的新闻源(故事板底部的图片)。

第二个视图控制器用于启动拍摄照片并将一些数据附加到其上。在最后一步(右上角),触摸"保存"在导航栏的右侧项目中,我希望将用户重定向到新闻源View Controller传递一些数据。

我尝试使用segue并且它有效。数据将传递到新闻源,但选择了错误的选项卡。我使用

更改了所选标签
[self.tabBarController setSelectedIndex:0];

但是再次点击第二个标签,事情就搞砸了。我可以看到新闻源而不是拍照。如果我再次点击,它会崩溃。

在某些时候,我认为我可能有错误的故事板,并且应该在我的新闻源中实施TabBar并将拍照作为模态视图处理。

你知道任何干净的方法吗?

由于

2 个答案:

答案 0 :(得分:1)

您不应该使用正常的segue,目标控制器添加到堆栈中。要做到最好的方法应该是使用unwind segue。这是您需要做的粗略草图:

•在NewsfeedController (IBAction)unwindFromPictureSaved:(UIStoryboardSegue *)segue中声明展开segue动作,如SavingPictureController; •将SavedPictureSegue中的“保存”按钮连接到故事板中的“退出”图标,然后选择之前定义的方法;
•在新创建的展开segue中,使用类似SavingPictureController的内容定义其标识符;
•使用类似@property (strong, readonly, nonatomic) id passedData的内容定义要在SavingPictureController标题中传递的数据;
•在-(void)prepareForSegue:(UIStoryboardSegue *)segue { if ([segue.identifier isEqualToString:@"SavedPictureSegue"]) { _passedData = // Your data here } } 实施

NewsfeedController

•在(SavingPictureController *)segue.sourceController中,现在实现先前定义的方法并从#import "SavingPictureController.h"获取数据。请务必{{1}}。

答案 1 :(得分:0)

感谢@Davide,我创建了TabBarController的子类并实现了以下方法:

// Find the appropriate controller to answer to an unwind segue
// For each child view controller
// Checks if it is a Navigation Controller
// If it is check its children view controllers
// Return the first view controller that answers the unwind segue
// This because I assumed the default behavior is just to check one level up (in this case, it would have stopped at the NavigationController)
// Based on https://developer.apple.com/library/ios/technotes/tn2298/_index.html#//apple_ref/doc/uid/DTS40013591-CH1-CCVC-SELECTING_A_CHILD_VIEW_CONTROLLER_TO_HANDLE_AN_UNWIND_ACTION
- (UIViewController *)viewControllerForUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender {
    BOOL resChildren, res;
    for(UIViewController *controller in self.childViewControllers) {
        if ([controller isKindOfClass:[UINavigationController class]]) {
            for (UIViewController *childController in controller.childViewControllers) {
                resChildren = [childController canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
                if (resChildren) {
                    return childController;
                }
            }
        }
        res = [controller canPerformUnwindSegueAction:action fromViewController:fromViewController withSender:sender];
        if (res) {
            return controller;
        }
    }
    return nil;
}

然后在' NewsFeedController"的展开方法中有必要设置正确的索引以查看控制器,如:

[self.tabBarController setSelectedIndex:1];

我在https://github.com/kintso/unwindSegueWithTabBarControllerAndNavigationController

上的github上传了一个演示