Ios 使用自定义segue开始/结束外观转换的调用不平衡

Ios 使用自定义segue开始/结束外观转换的调用不平衡,ios,swift,uistoryboardsegue,Ios,Swift,Uistoryboardsegue,在按按钮执行以下交叉溶解自定义顺序时(在中学习): 我收到“开始/结束外观转换的不平衡调用”警告/错误 我已经彻底搜索了许多问题: 我的回答:我使用segue作为按钮按下,而不是在TabBar控制器中,所以这个答案不适用 我的回答:我尝试了两种方法:1)使用self.performsguewithidentifier以编程方式完成所有segue;2)通过界面生成器完成所有segue,方法是单击并拖动按钮,然后从所选segue的属性窗格中选择我的自定义转换。两者都产生了上述错误 我

在按按钮执行以下交叉溶解自定义顺序时(在中学习):

我收到“开始/结束外观转换的不平衡调用”警告/错误

我已经彻底搜索了许多问题:

  • 我的回答:我使用segue作为按钮按下,而不是在TabBar控制器中,所以这个答案不适用

  • 我的回答:我尝试了两种方法:1)使用self.performsguewithidentifier以编程方式完成所有segue;2)通过界面生成器完成所有segue,方法是单击并拖动按钮,然后从所选segue的属性窗格中选择我的自定义转换。两者都产生了上述错误

  • 我的回答:和上面一样,双重检查所有的segue只执行了一次,要么是通过编程方式,要么是通过接口生成器,而不是两者都执行

  • 我的回答:我没有在序列中使用表视图控制器或导航控制器,所以这个答案不适用

  • 我的回答是:我试着在一次调度中执行所有的分段,如下所示

    let delay = 0.01 * Double(NSEC_PER_SEC)
    let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay))
    dispatch_after(time, dispatch_get_main_queue()) {
    
       self.performSegueWithIdentifier("toNonFBLogin", sender: nil)
    
     }
    
但是仍然无效,警告/错误仍然会弹出

我知道错误的意思,它试图在加载前一个viewcontroller之前呈现一个新的viewcontroller,但不确定如何处理它

我唯一的线索是,前一个(源)viewcontroller在加载最终viewcontroller之前很快弹出,如0:04时所示

不过,我估计有5%的时候,这个小故障才真正出现


有什么想法吗?

看起来这种行为是最近iOS版本中一些尚未记录的变化的结果。 我对你的问题感到沮丧,而且没有令人满意的答案,我想到了以下几点:

// create a UIImageView containing a UIImage of `view`'s contents
func createMockView(view: UIView) -> UIImageView {
    UIGraphicsBeginImageContextWithOptions(view.frame.size, true, UIScreen.mainScreen().scale)

    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()
    return UIImageView(image: image)
}

override func perform() {

   let src:UIViewController = self.sourceViewController as! UIViewController
   let dstn:UIViewController = self.destinationViewController as! UIViewController
   let mock = createMockView(dstn.view)

   src.view.addSubview(mock)
   mock.alpha = 0

   UIView.animateWithDuration(0.75, delay: 0.1, options: UIViewAnimationOptions.TransitionCrossDissolve, 
     animations: { () -> Void in
        mock.alpha = 1
     },
     completion: { (finished) -> Void in
        src.presentViewController(dstn, animated: false, completion: { mock.removeFromSuperView()})
   })
}
createMockView()
将创建一个包含目标VCs内容快照的
UIImageView
,并使用该快照执行转换动画。
转换完成后,将显示真实的目标VC,而不会出现动画,从而在两者之间实现无缝转换。最后,演示完成后,模拟视图将被删除。

Shirkrin!!!!!虽然有一些语法错误,但逻辑是合理的,工作非常出色!非常感谢您!!!!!!!:()()())())())())(很高兴它能为您工作-我一回到家就会纠正语法错误;)
// create a UIImageView containing a UIImage of `view`'s contents
func createMockView(view: UIView) -> UIImageView {
    UIGraphicsBeginImageContextWithOptions(view.frame.size, true, UIScreen.mainScreen().scale)

    view.drawViewHierarchyInRect(view.bounds, afterScreenUpdates: true)
    let image = UIGraphicsGetImageFromCurrentImageContext()

    UIGraphicsEndImageContext()
    return UIImageView(image: image)
}

override func perform() {

   let src:UIViewController = self.sourceViewController as! UIViewController
   let dstn:UIViewController = self.destinationViewController as! UIViewController
   let mock = createMockView(dstn.view)

   src.view.addSubview(mock)
   mock.alpha = 0

   UIView.animateWithDuration(0.75, delay: 0.1, options: UIViewAnimationOptions.TransitionCrossDissolve, 
     animations: { () -> Void in
        mock.alpha = 1
     },
     completion: { (finished) -> Void in
        src.presentViewController(dstn, animated: false, completion: { mock.removeFromSuperView()})
   })
}