<firstviewcontroller的开始/结束外观转换的不平衡调用:0x2a2c00 =“”> </firstviewcontroller:>

时间:2011-07-24 20:43:32

标签: iphone ios transition

我在模拟我的应用时出现此问题,这不是错误或警告,但它出现在我的控制台中,有没有人曾经历过这个问题?

25 个答案:

答案 0 :(得分:48)

在我的情况下,当您非常快速地单击tableview中的两个选项卡时会发生此错误。

结果导致titlename错误,后退按钮消失。有人提到当您推送视图时,set animated:NO。错误将消失但仍会导致一些奇怪的行为。它会推送两个视图,然后您需要返回两次才能返回tableview屏幕。

我尝试的方法是为了解决这个问题:

添加BOOL cellSelected;

{p} viewWillAppear cellSelected = YES;

中的

在didselectcell委托if (cellSelected){cellSelected = NO; do action ; }

这有助于防止非常快速地点击两个不同的单元格。

答案 1 :(得分:42)

就我而言,当我在[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];项目的UINavigationController方法中触发viewDidLoad时,就发生了这种情况。

将其移至viewDidAppear方法解决了问题。

原因很可能是viewDidLoad并非所有花哨的动画都已经完成,而在viewDidAppear一切都已完成。

答案 2 :(得分:21)

我也有这个问题。我找到了两个解决这个问题的方法:

  1. 您可以在上面看到此解决方案。
  2. 我找到了UINavigationController的子类,此问题已解决。 Buffered Navigation Controller

答案 3 :(得分:15)

您应该在不同的循环中运行代码以避免此

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

答案 4 :(得分:12)

我在同一个问题上遇到了很多问题。我通过这种方式解决了这个问题

1)您没有使用UIViewController's指定的初始值设定项initWithNibName:bundle:。尝试使用它而不仅仅是init

2)将animated:YES设置为NO,这解决了问题。 例如。 [self.navigationController pushViewController: viewController_Obj animated:NO];

答案 5 :(得分:7)

确保您不要忘记在-viewWillAppear,-viewDidAppear,-viewDidLoad,-viewWillDisappear,-viewDidDisappear中调用该方法的重载中的正确super方法。 例如在我的情况下,我不匹配的方法名称如下:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

请注意显示消失方法不匹配

答案 6 :(得分:7)

我使用导航控制器并将其他控制器推送到它时遇到了同样的问题。 我尝试使用Buffered Navigation Controller和其他几种方法,但它对我不起作用。花了一些时间搞清楚后,我注意到如果你试图在前一个事务(动画)正在进行时推动新的视图控制器(我估计持续约0.5秒)就会出现这个问题。无论如何,我通过委派导航控制器并等待以前的动画完成来快速解决。

答案 7 :(得分:2)

我有一个类似的问题涉及重绕模态对话框。在这里发布解决方案......

https://stackoverflow.com/a/38795258/324479

[问题]

导航控制器 - &gt; VC1 -Push - &gt; VC2 -PopOver或Modal Segue - &gt; VC3。

VC3正在退回到VC1。

当从VC2到VC3的Segue是PopOver和Modal时,unwind以警告结束:UIViewController的开始/结束外观转换的不平衡调用&#34;

如果推动从VC到VC的Segue,警告就会消失。

[解决]

如果解除逻辑会处理这个问题会很棒。也许这是一个错误,也许不是。无论哪种方式,解决方案是使VC2(具有弹出窗口的控制器)成为倒带的目标,然后在弹出导航控制器之前等待它完成出现。这确保了倒带(反向弹出)动画有足够的时间完成后再向后移动。即使动画关闭,它仍然需要等待,否则你会收到错误。

您的VC2代码应如下所示。 (SWIFT)

import UIKit

class MainPageVC: UIPageViewController
{
    var totalPages: [UIViewController] = [UIViewController]()

    @IBOutlet weak var rightBarButtonItem: UIBarButtonItem!

    override func viewDidLoad()
    {
       super.viewDidLoad()

       let attributes: [String : AnyObject] = [NSFontAttributeName: Constants.defaultFont]
    rightBarButtonItem.setTitleTextAttributes(attributes, forState: .Normal)

       self.delegate = self
       self.dataSource = self

       let eyeWearVC = storyboard!.instantiateViewControllerWithIdentifier("eyeWear") as! EyeWearVC
       let fitnessVC = storyboard!.instantiateViewControllerWithIdentifier("fitness") as! FitnessVC
       let healthVC = storyboard!.instantiateViewControllerWithIdentifier("health") as! HealthVC
       let environmentVC = storyboard!.instantiateViewControllerWithIdentifier("environment") as! EnvironmentVC

       totalPages.append(eyeWearVC)
       totalPages.append(fitnessVC)
       totalPages.append(healthVC)
       totalPages.append(environmentVC)

       setViewControllers([eyeWearVC], direction: .Forward, animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning()
    {
       super.didReceiveMemoryWarning()
    }

    func viewControllerAtIndex(index: Int)-> UIViewController
    {
       if self.totalPages.count == 0 || index >= self.totalPages.count
       {
           return UIViewController()
       }

       return totalPages[index]
   }

extension MainPageVC: UIPageViewControllerDelegate
{

}

extension MainPageVC: UIPageViewControllerDataSource
{
    func presentationCountForPageViewController(pageViewController: UIPageViewController) -> Int
    {
        return totalPages.count
    }

    func presentationIndexForPageViewController(pageViewController: UIPageViewController) -> Int
    {
        return 0
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController?
    {
        var currentIndex: Int = totalPages.indexOf(viewController)!

        if currentIndex == 0 || currentIndex == NSNotFound
        {
            return nil
        }

        currentIndex -= 1

        return self.viewControllerAtIndex(currentIndex)
    }

    func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController?
    {
        var currentIndex: Int = totalPages.indexOf(viewController)!

        if currentIndex == NSNotFound
        {
            return nil
        }

        currentIndex += 1

        if currentIndex == totalPages.count
        {
            return nil
        }

        return self.viewControllerAtIndex(currentIndex)
    }
}

答案 8 :(得分:2)

原因对于消息:当且仅当您从viewWillAppearloadViewinit或{推送/呈现另一个视图控制器时,才会显示此消息{1}}当前View Controller的方法

删除错误的方法消息:将推送/呈现代码移至viewDidLoad方法将解决问题

答案 9 :(得分:2)

'对'

的开始/结束外观转换的不平衡调用

表示在最后一个相关动画未完成之前启动动画。那么,在推新视图控制器之前,你是否弹出任何视图控制器?或者可能会弹出根?如果是,请尝试不使用动画,[self.navigationController popToRootViewControllerAnimated:NO];

看看这是否能解决问题,在我的情况下,这就解决了问题。

答案 10 :(得分:1)

当我点击NIB中的按钮时,我也遇到了这个问题。事实证明我偶然连接了按钮以向两个IBAction方法发送一个事件,每个方法都执行了一个pushViewController:animated:

答案 11 :(得分:1)

我遇到了这个问题,因为我是在没有UITabbar的情况下从一个viewController调用UIPrintInteractionController,而不是UINavigationBar。似乎UIPrintInteractionController没有获得正确的printInteractionControllerParentViewController。 在委托中实现该方法并返回当前为我工作的rootViewController。

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

答案 12 :(得分:1)

我实施了一些逻辑,等待推送UIViewController直到所有数据都被下载。此逻辑中存在错误,导致在进行另一个API调用时过早推送UIViewController

它导致同一UIViewControllerUINavigationController推了两次并发出此警告。

答案 13 :(得分:1)

当我使用navigationcontroller的pop方法时,我遇到了同样的问题 在我的应用程序中,我使用单独的逻辑导航控制器,因此避免使用导航栏,它总是隐藏。然后我使用自定义视图和通知来处理后退按钮及其事件。通知观察员已注册,但未被删除。因此通知会触发两次,并产生上述错误。彻底检查你的代码以获得这样的错误

答案 14 :(得分:1)

我也在

得到了这个
[self dismissModalViewControllerAnimated:YES];

我将YES更改为NO,这解决了问题。

答案 15 :(得分:1)

对于它的价值,我在[super viewDidLoad:animated]覆盖中不包括对viewDidLoad的调用时遇到同样的错误。

答案 16 :(得分:1)

我在尝试时遇到了类似的问题:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];
- (void) popUpToLevelTwo;之类的函数中

,并在函数末尾放置return;解决问题

答案 17 :(得分:1)

如果要添加具有模态视图控制器的视图作为子视图,则可能发生这种情况。最好用:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

基本上说,对于那些你试图显示的viewControllers,视图生命周期没有简化。

答案 18 :(得分:0)

导航错误“错误调用开始/结束外观转换”背后的原因是导航|同时发生两次

答案 19 :(得分:0)

一个解决方案是,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

答案 20 :(得分:0)

如果您在完成加载之前尝试解除UIViewController,则可以遇到此问题。

我在控制台中有这个消息,并且完全专注于呈现新UIViewController的UIViewController,但没有成功。我终于发现问题出在我提出的UIViewController中,因为用户没有登录他们的帐户而自行解雇。

希望这有助于某人。

答案 21 :(得分:0)

这对我来说很难: 我已经覆盖了

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

没有覆盖:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

在我的窗口根导航控制器中。 然后,当使用上述警告推动另一个视图控制器时,儿童导航控制器抱怨。 警告不是最坏的, 最大的问题是,儿童导航控制器的代表不再被召唤。 weired。

答案 22 :(得分:0)

就我而言,我是在NSData'NSURL'方法中从viewDidLoad获取let newurl = NSURL(string: "http://www.handasaim.co.il") var error: NSError? let html = NSString(contentsOfURL: newurl!, encoding: NSASCIIStringEncoding, error: &error) if (error != nil) { println("Whoops, something went wrong") } else { println(html) }

答案 23 :(得分:0)

当我忘记设置Break时,我遇到了这个问题;在switch语句中推送视图后!

喜欢这里:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

答案 24 :(得分:0)

快捷键4

我的问题是,我要在完成当前的渲染之前提交另一个VC。

解决方案是在快速延迟后展示我的nextVC。

您不应做什么

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

您应该做什么

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}