{ [VC-Home,VC-1] }
而在调用pushViewController之后,它仍然保持不变。 VC-2没有添加到堆栈中。
据我所知,导航控制器通过在动画开始之前使先前的视图控制器无效来启动动画,但然后动画从未发生,使导航控制器处于冻结状态。
我通过调用UIStoryboard(name:“Main”,bundle:nil).instantiateViewControllerWithIdentifier(“ViewController”)
从故事板创建新的视图控制器,因此我认为那里没有任何问题。我也没有覆盖导航栏上的pushViewController。我的应用程序的一些独特之处是它具有非常高分辨率的图像(使用SDWebImage来管理),并且一次始终在屏幕上有三个容器(一个导航控制器,一个搜索视图控制器和一个交互式的装饰/侧面/滑出菜单)。
CPU使用率低,内存使用率正常(设备冻结时稳定在60-70MB左右)。
是否有任何可能导致此问题的想法或任何可以帮助我发现真正问题的调试提示?
更新
由于我只是使用pushViewController()进行推送,因此没有唯一的UINavigationController代码。这是调用它的代码:
func didSelectItem(profile: SimpleProfile) {
let vc = UIStoryboard.profileViewController()
vc.profile = profile
navigationController?.pushViewController(vc, animated: true)
}
我推出的 ViewController 在 viewDidLoad 中有以下代码:
override func viewDidLoad() {
super.viewDidLoad()
button.roundView()
if let type = profile?.profileType {
//load multiple view controllers into a view pager based on type
let viewControllers = ProfileTypeTabAdapter.produceViewControllersBasedOnType(type)
loadViewPagerViews(viewControllers)
let topInset = headerView.bounds.height + tabScrollView.contentSize.height
if let viewPager = viewPager {
for view in viewPager.views {
if let tempView = view as? PagingChildViewController {
tempView.profile = fullProfile
tempView.parentVCDelegate = self
tempView.topInset = topInset
}
}
}
}
}
func loadViewPagerViews(viewControllers: [UIViewController]) {
viewPager?.views = viewControllers
viewPager?.delegate = self
//loading views into paging scroll view (using PureLayout to create constraints)
let _ = subviews.map { $0.removeFromSuperview() }
var i = 0
for item in views {
addSubview(item.view)
item.view.autoSetDimensionsToSize(CGSize(width: tabWidth, height: tabHeight))
if i == 0 {
item.view.autoPinEdgeToSuperviewEdge(.Leading)
} else if let previousView = views[i-1].view {
item.view.autoPinEdge(.Leading, toEdge: .Trailing, ofView: previousView)
}
if i == views.count {
item.view.autoPinEdgeToSuperviewEdge(.Trailing)
}
i += 1
}
contentSize = CGSize(width: Double(i)*Double(tabWidth), height: Double(tabHeight))
}
更新2
我终于让它再次冻结了。应用程序在后台,我把它带回来并尝试将视图控制器推到堆栈上时它就冻结了。我注意到有一个动画正在进行中。页面顶部有一个滚动视图,每10秒钟浏览其内容(类似于应用商店的顶部横幅)。在这次冻结中,我注意到横幅正处于动画中。
这是我UIScrollView的滚动函数,每10秒钟调用一次:
func moveToNextItem() {
let pageWidth: CGFloat = CGRectGetWidth(frame)
let maxWidth: CGFloat = pageWidth * CGFloat(max(images.count, profileImages.count))
let contentOffset: CGFloat = self.contentOffset.x
let slideToX = contentOffset + pageWidth
//if this is the end of the line, stop the timer
if contentOffset + pageWidth == maxWidth {
timer?.invalidate()
timer = nil
return
}
scrollRectToVisible(CGRectMake(slideToX, 0, pageWidth, CGRectGetHeight(frame)), animated: true)
}
我不记得动画/滚动会导致推送停止,但我可能错了。
我还重新检查了堆栈,情况与上述描述相同,其中 [VC-Home, VC-1] 是堆栈,而 VC-2 没有被推入。我还查看了 VC-1 的变量,所有的数据调用和图像加载都已完成。
更新3
这变得越来越奇怪了。我重写了 pushViewController,以便在 Alessandro Ornano 的回复基础上进行一些调试。如果我尝试无法推送视图控制器,然后将我的应用程序发送到后台,并在 pushViewController 调用中设置断点,然后将应用程序带回前台,那么断点会立即被触发多次。如果我继续通过所有命中点,那么下一个视图控制器会突然出现,并且我尝试推送的最后一个视图控制器现在成为堆栈上的最后一个视图控制器。这意味着我看到的仍然是禁用的,这本质上使我处于之前的位置。