我在模拟我的应用时出现此问题,这不是错误或警告,但它出现在我的控制台中,有没有人曾经历过这个问题?
答案 0 :(得分:48)
在我的情况下,当您非常快速地单击tableview中的两个选项卡时会发生此错误。
结果导致titlename错误,后退按钮消失。有人提到当您推送视图时,set animated:NO
。错误将消失但仍会导致一些奇怪的行为。它会推送两个视图,然后您需要返回两次才能返回tableview屏幕。
我尝试的方法是为了解决这个问题:
添加BOOL cellSelected;
viewWillAppear
cellSelected = YES;
中的
在didselectcell委托if (cellSelected){cellSelected = NO; do action ; }
这有助于防止非常快速地点击两个不同的单元格。
答案 1 :(得分:42)
就我而言,当我在[self performSegueWithIdentifier:@"SomeIdentifier" sender:self];
项目的UINavigationController
方法中触发viewDidLoad
时,就发生了这种情况。
将其移至viewDidAppear
方法解决了问题。
原因很可能是viewDidLoad
并非所有花哨的动画都已经完成,而在viewDidAppear
一切都已完成。
答案 2 :(得分:21)
我也有这个问题。我找到了两个解决这个问题的方法:
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
[问题]
导航控制器 - > VC1 -Push - > VC2 -PopOver或Modal Segue - > VC3。
VC3正在退回到VC1。
当从VC2到VC3的Segue是PopOver和Modal时,unwind以警告结束:UIViewController的开始/结束外观转换的不平衡调用"
如果推动从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)
原因对于消息:当且仅当您从viewWillAppear
,loadView
,init
或{推送/呈现另一个视图控制器时,才会显示此消息{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
。
它导致同一UIViewController
被UINavigationController
推了两次并发出此警告。
答案 13 :(得分:1)
答案 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)
}