标签: unwind-segue

当不是模态时,展开segue不会忽略自适应弹出窗口

iOS 9测试版的更新:Apple可能已针对iOS 9修复此问题.如果您针对iOS 8解决此问题,请确保它在iOS 9上也能正常运行.

在故事板中,我创建了一个popover演示文件segue,用于从按钮呈现导航和视图控制器,以及创建展开segue.

在纵向方向上,模态(全屏)演示按预期展开/解除.

在横向方向上,展开segue也会被调用,但是弹出窗口不会被自动解除.

我错过了挂钩的东西吗?我是否必须自己解雇popover演示文稿?

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)__unused sender
{
    if ([[segue identifier] isEqualToString:@"showSelectBookChapter"])
    {
        UINavigationController *navigationController = segue.destinationViewController;

        if ([navigationController.topViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *selectViewController = (BIBLESelectViewController *)navigationController.topViewController;
            selectViewController.initialBookChapterVerse = self.bookChapterVerse;
        }
    }
}

- (IBAction)unwindToBIBLEChapterViewController:(UIStoryboardSegue *)segue
{
    if ([segue.identifier isEqualToString:@"unwindToBIBLEChapterViewController"]) {
        if ([segue.sourceViewController isKindOfClass:[BIBLESelectViewController class]])
        {
            BIBLESelectViewController *sourceViewController = (BIBLESelectViewController *)segue.sourceViewController;
            self.bookChapterVerse = sourceViewController.selectedBookChapterVerse;
            [self.tableView reloadData];

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

故事板场景和segues 更新: 在查看gabbler的示例代码之后,我已经将问题缩小到popover在单视图应用程序中解除罚款,但不是在Master-Detail应用程序中.

更新2: 这是层次结构的样子(为简单起见,省略了导航控制器),回答了Luis问的问题:

  • 拆分视图控制器
    • 主视图控制器
    • 细节视图控制器
      • 章节视图控制器(模态页面表)
        • 选择视图控制器(解开章节视图控制器的有问题的弹出窗口,但不解除)

正如我在上一次更新中提到的,我创建了一个新的主/详细模板,并直接从详细视图中的(按钮)中显示了一个弹出窗口.它不会被解雇.

objective-c ios ios8 adaptive-ui unwind-segue

6
推荐指数
1
解决办法
4228
查看次数

适用于iOS 8和iOS 9的自定义Unwind Segue

我的问题是,如何让以下自定义展开segue在iOS 9之前的版本以及运行iOS 9的设备上运行?

我有一个自定义Segue显示一个视图控制器,然后有一个相应的自定义展开Segue.此代码在iOS 8中运行良好,并通过创建UIStoryboardSegue的子类并实现该perform方法来实现.然后我在自定义导航控制器中覆盖以下方法:

- (UIStoryboardSegue *) segueForUnwindingToViewController:    (UIViewController *)toViewController fromViewController:(UIViewController *)fromViewController identifier:(NSString *)identifier
{
    UIStoryboardSegue *segue;
    if([fromViewController isKindOfClass:[MyViewController class]]){
        segue = [[CustomSegue alloc] initWithIdentifier:identifier source:fromViewController destination:toViewController]; //Custom Unwind Segue
    }
    else{
        UIStoryboardSegue *unwindSegue = [super segueForUnwindingToViewController:toViewController fromViewController:fromViewController identifier:identifier]; //Normal Unwind Segue
        segue = unwindSegue;
    }
    return segue;
}
Run Code Online (Sandbox Code Playgroud)

在iOS 9中,segueForUnwindingToViewController已弃用.它仍适用于MyViewController CustomSegue; 但是,默认的展开segue不再适用于任何其他展开segue.虽然在super上调用方法会返回一个展开segue,但segue永远不会发生,视图控制器永远不会弹出,并且用户永远不会返回到前一个屏幕.所以要清楚一点,如果我使用常规show segue,相应的unwind segue会调用不推荐使用的方法,该方法在super上调用方法,但不起作用.

我在故事板上观看了WWDC的演讲,我能够在iOS 9中修复此问题:a)不再在我的自定义导航控制器中覆盖此方法,b)进入故事板,单击自定义segue,然后输入CustomSegue作为Segue Class.不幸的是,由于我的目标是iOS 7,我收到警告"只有自定义segues支持iOS 9之前的类名",而自定义展开segue现在不适用于iOS 7或iOS 8!

backwards-compatibility ios unwind-segue ios9 xcode7

6
推荐指数
1
解决办法
3359
查看次数

iOS - 展开我的初始视图控制器

我正在使用展开segue来展开我的故事板中的初始视图控制器.展开效果很好,我在初始视图控制器中实现了这个方法:

- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我在展开后尝试使用segue到另一个视图控制器,我会收到以下错误:

警告:尝试显示其视图不在窗口层次结构中!

看起来这只有在我放松到故事板中被检查为"初始视图控制器"的视图控制器时才会出现.这是一个错误吗?我应该能够放松到初始控制器吗?其他想法?

编辑:

以下是我执行第二个segue的方法:

[self performSegueWithIdentifier:@"mySegue" sender:nil];
Run Code Online (Sandbox Code Playgroud)

我应该注意这是一个登录/注销问题.当我第一次登录从登录控制器到下一个控制器的segue工作时.当我退出时,我放松到初始视图控制器.然后我再次登录,从我的登录控制器到下一个控制器的segue不起作用.

编辑2:

从更多的研究中我找到了它,因为我正在使用代表登录.登录是异步的,我用AFNetworking打电话,当它完成后我调用我的登录委托(在这种情况下登录VC).此时,登录VC可以转到视图.

登录代码:

- (void) login: (NSDictionary *) parameters {
    [http.manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
       [self.loginDelegate loginSuccess:response]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       [self.loginDelegate loginFailure:error]; 
    }];
}
Run Code Online (Sandbox Code Playgroud)

我的登录名VC是委托人:

- (void) loginSuccess:(NSDictionary *) response {
    // setup user info based on response
    ...
    // Segue 
    [self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}
Run Code Online (Sandbox Code Playgroud)

我已经检查过我是主线程的时候和我一起但仍然没有运气.我知道AFNetworking总是调用主线程上的成功/失败块.

棘手的部分.如果我将上面的代码更改为使用块而不是委托,则storyboard/segue不会搞砸,我可以多次登录和注销,没有任何问题.

为什么segue第一次使用委托模式,但在注销(展开)时,我不能再使用那个segue吗?

编辑3:

更多调查显示,在展开我的登录VC viewDidAppear被调用两次.在初始展开时,视图仍然在堆栈中,显示它快速显示并调用viewDidAppear.然而,这很快就会被动画化,而viewWillAppear会被另一个VC称为第二次.我认为这可能是问题的根源.为什么当我放松到那个VC的时候,它的动画效果只会被动画回来?

objective-c ios unwind-segue

5
推荐指数
1
解决办法
571
查看次数

为什么我的放松赛道会回到太远?

我正在尝试为我的应用程序的注册过程创建控制器架构.下面是当前状态的图像:

控制器架构

该应用程序首次在登录页面启动,如果用户单击"SignUp",则会以模态方式呈现导航控制器self.presentViewController.然后导航控制器推动视图控制器,然后推送到第二视图控制器.在该第二视图控制器上,用户必须首先按"开始"以模式导航到在继续注册过程之前请求附加信息的视图控制器.一旦用户在该模态呈现的控制器上输入附加信息,用户按下"返回"以通过展开segue返回到第二视图控制器.

但是,按下此按钮时,展开segue将返回到第二个视图控制器,但随后会立即返回"登录"页面.即使unwind函数嵌套在第二个视图控制器中,似乎unwind segue也会弹出所有模态显示的视图.

发生了什么以及解开第二个注册页面的解决方案是什么?

xcode ios swift unwind-segue

3
推荐指数
1
解决办法
1104
查看次数

如何在没有动画的情况下执行展开segue?

如何在没有任何动画的情况下执行展开segue.我尝试设置一个放松segue并在右侧的故事板中取消选中"Animates",但它仍然是动画的(它向下滑动),我该如何解决这个问题?

xcode ios swift unwind-segue

3
推荐指数
1
解决办法
1395
查看次数

Unwind Segue - 在哪里拖动退出?

我试图了解展开转场是如何工作的。首先我创建了 3 个 ViewController。

GlobalVC
 -LoginVC
 -RegisterVC 
Run Code Online (Sandbox Code Playgroud)

我将初始页面设置为 GlobalVC(只有经过身份验证的用户才能看到)。我设置了一个segue:

GlobalVC to LoginVC打电话globalToLoginLoginVC to RegisterVC打电话loginToRegister。这是我的故事板:

在此输入图像描述

对于 registerToLogin 方向,我使用了这个解决方法(在 RegisterVC 中),但看起来有点难看。

@IBAction func unwindToLogin(sender: AnyObject) {
    //Dismiss View
    dismissViewControllerAnimated(true, completion: nil)
}
Run Code Online (Sandbox Code Playgroud)

然而,现在我试图直接从LoginToGlobal

首先,我选择登录按钮,将其拖到 LoginVC:

@IBAction func loginButton(segue: UIStoryboardSegue) {
    performSegueWithIdentifier("unwindToGlobal", sender: self)
}
Run Code Online (Sandbox Code Playgroud)

设置好后segue: UIStoryboardSegue,现在就可以右键退出了。但是,我在这里感到困惑。无论我尝试将 Exit 内的圆圈拖动到什么位置,都会出现错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,>原因:“接收器(0x7fdd2068a480>)没有标识符为“unwindToGlobal”的segue

我应该将圆圈拖到哪里?(我一直看到Unwind segue to 'Exit'

在此输入图像描述

xcode ios segue swift unwind-segue

2
推荐指数
1
解决办法
1770
查看次数

使用Swift无需使用情节提要即可轻松进行搜索

我似乎找不到解决此问题的方法。我发现的所有关于解散segue的主题都通过情节提要板实现了segue。

我正在尝试学习如何使用代码来制作布局。因此,在新的Xcode项目中,我将删除情节提要文件。

我想在我的视图控制器上进行放样,将用户登录到我的应用程序的主屏幕。用户成功登录后,视图应展开。

谁能为我指出正确的方向,说明如何仅使用代码即可达到这种效果?

xcode ios segue swift unwind-segue

2
推荐指数
1
解决办法
2674
查看次数

展开segue - 当多个视图调用它时返回调用视图

我有一个视图控制器(在导航控制器中)A切换到视图控制器B,视图控制器C也切换到B(A - > B < - C).视图控制器B用于选择传递回A或C的值,但如果单击"取消"或"完成",它将使用展开segue返回仅一个控制器,以最后连接的为准.

ios segue swift unwind-segue

1
推荐指数
1
解决办法
325
查看次数

方向改变后 Unwind Segue 崩溃

我有一个 unwind segue,它在 iOS 9.3 上的横向或纵向都可以正常工作,但是如果我在呈现目标视图控制器 (A) 和执行展开 (C) 的视图控制器之间旋转设备,则会引发以下异常。

任何想法为什么会发生这种情况,以及如何解决这个问题?

我的故事板的高级视图:

在此处输入图片说明

例外:

2016-03-28 16:58:14.194 ClarityLife[96444:11508887] *** Assertion failure in -[_UIStoryboardUnwindChain initFromSourceViewController:toDestinationViewController:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.60.7/UIStoryboardUnwindSegueTemplate.m:119
2016-03-28 16:58:14.202 ClarityLife[96444:11508887] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not unwind from <ClarityLife.VideoCallDisconnectingViewController: 0x7fdaa07c2b50> to <ClarityLife.VideoCallIdleViewController: 0x7fdaa2c13ab0> because a common ancestor could not be found. (Note that it is not supported to unwind from a view controller to one of its descendants.)'
*** First throw call stack:
(
  0   CoreFoundation                      0x000000011128bd85 __exceptionPreprocess + …
Run Code Online (Sandbox Code Playgroud)

uisplitviewcontroller ios segue unwind-segue

1
推荐指数
1
解决办法
767
查看次数

当文本框值等于 nil 时取消展开转场

如果文本框值等于 nil,我想取消展开转场。下面是当前的代码。我使用故事板连接保存按钮(将文本值保存到数据库中)。我正在考虑使用 poptorootviewcontroller 确保教科书在执行转场之前具有值。他们有什么方法可以用当前的代码来做到这一点吗?

mainView 内部的代码可以恢复到-

@IBAction func unwind(_ segue: UIStoryboardSegue){
    print("Back in TableView")

}
Run Code Online (Sandbox Code Playgroud)

childView 上的按钮执行 unwind segue-

 @IBAction func saveAddress(_ sender: UIButton) {
    // save values to dictionary save dictionary to firebase under user, uid, addresses
    // uialert controller if fields are not completed do not allow segue if fields are not complete
    // perform segue to addresstableview

    let addy1: String = address1Txt.text!
    let addy2: String = address2Txt.text!
    let aptNum: String = aptTxt.text!
    let city: String = cityTxt.text! …
Run Code Online (Sandbox Code Playgroud)

textbox ios segue swift unwind-segue

1
推荐指数
1
解决办法
491
查看次数

如何在Swift中使用警报视图展开segue?

我有几个视图控制器.如果确认了警报视图,我需要返回第一个View Controller.如果没有放松Segue,我就会这样做:

@IBAction func unwindToDelete ( segue: UIStoryboardSegue ) {

    let alertView = UIAlertController(title: "Delete?", message: "Are you sure you wante to delete?", preferredStyle: .ActionSheet)

    let deleteAction = UIAlertAction (title: "Delete", style: .Destructive ) { alertAction in

        self.deleteChoice = true
    }

    let cancelAction = UIAlertAction (title: "Cancel", style: .Cancel ) {  alertAction in

    }

    alertView.addAction(deleteAction)
    alertView.addAction(cancelAction)

    self.presentViewController(alertView, animated: true, completion: nil)

}
Run Code Online (Sandbox Code Playgroud)

但是,如果我这样做,在这段代码中它会崩溃,因为最后一行代码.

这是错误:

2015-04-30 14:59:45.605 PhotosCollection[4624:182995] 
popToViewController:transition: called on <UINavigationController 0x7a67aeb0> 
while an existing transition or presentation is occurring; …
Run Code Online (Sandbox Code Playgroud)

iphone uialertview swift unwind-segue

0
推荐指数
1
解决办法
3019
查看次数