我正在处理的应用程序中有以下故事板:
在根目录中,我有一个标签栏控制器。它链接到两个视图控制器。
第一个视图控制器,用于显示用户上传的图片的新闻源(故事板底部的图片)。
第二个视图控制器用于启动拍摄照片并将一些数据附加到其上。在最后一步(右上角),触摸"保存"在导航栏的右侧项目中,我希望将用户重定向到新闻源View Controller传递一些数据。
我尝试使用segue并且它有效。数据将传递到新闻源,但选择了错误的选项卡。我使用
更改了所选标签[self.tabBarController setSelectedIndex:0];
但是再次点击第二个标签,事情就搞砸了。我可以看到新闻源而不是拍照。如果我再次点击,它会崩溃。
在某些时候,我认为我可能有错误的故事板,并且应该在我的新闻源中实施TabBar并将拍照作为模态视图处理。
你知道任何干净的方法吗?
由于
答案 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上传了一个演示