iOS 应用程序在 PushViewController 上冻结

2023-12-13

我的导航控制器在按下时会间歇性冻结。它似乎将新的视图控制器添加到堆栈中,但动画从未发生。我还有另外两个容器,它们在屏幕上保存视图控制器,并且在导航控制器冻结后我可以与它们进行良好的交互。真正有趣的是,如果我尝试将另一个视图控制器推送到导航控制器的堆栈上,我注意到堆栈顶部有一个额外的视图控制器(我最初推送的视图控制器冻结了导航控制器)。因此,如果我在主屏幕上(我们将其称为 VC-Home)并且我尝试推送一个新视图 (VC-1) 并且它冻结,那么我尝试推送一个新视图 (VC-2),这是我在推送之前在当前堆栈中看到的内容:

{ [VC-Home, VC-1] }

而调用pushViewController后,还是一样; VC-2 未添加到堆栈中。

据我所知,导航控制器通过在动画开始之前使前一个视图控制器处于非活动状态来启动动画,但随后动画永远不会发生,使导航控制器处于冻结状态。

我通过调用从故事板创建新的视图控制器UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("ViewController")所以我认为那里没有任何问题。我也没有覆盖导航栏上的pushViewController。我的应用程序的一些独特之处在于,它具有非常高分辨率的图像(使用 SDWebImage 来管理它),并且我总是在屏幕上同时显示三个容器(一个导航控制器、一个用于搜索的视图控制器和一个交互式装订线/侧面/滑出菜单)。

CPU 使用率较低,内存使用率正常(当发生冻结时,设备上的内存使用率稳定在 60-70MB 左右)。

是否有任何可能导致此问题的想法或任何可以帮助我发现真正问题的调试技巧?

Update

UINavigationController 没有唯一的代码,因为我只是使用 PushViewController() 进行推送。这是调用它的代码:

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))
}

Update 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 的变量,所有内容都已加载(数据调用和图像加载)。

Update 3

这一点一滴都变得陌生了。我已经重写了 PushViewController,这样我就可以在其中放置一个断点,并根据 Alessandro Ornano 的响应进行一些调试。如果我推送视图控制器不成功,然后将我的应用程序发送到后台,在 pushViewController 调用中放置一个断点,然后将应用程序带回来,断点会立即被多次命中。如果我继续经过所有点击,下一个视图控制器突然变得可见,并且我尝试推送的最后一个视图控制器现在作为最后一个视图控制器位于堆栈上。这意味着我看到的那个仍然是禁用的,这基本上使我处于与以前相同的位置。


几周前我们也遇到了同样的问题。对于我们的问题,我们将其范围缩小到left-edge pop gesture recogniser。您可以尝试使用以下步骤检查是否可以重现此问题

  • 当其下方没有视图控制器时,尝试使用左边缘弹出手势(即在根视图控制器上,您的VC-Home控制器)
  • 此后尝试单击任何 UI 元素。

如果您能够重现冻结,请尝试禁用interactivePopGestureRecognizer当视图控制器堆栈只有一个视图控制器时。

参考this问题以获取更多详细信息。以下是链接中的代码,以便于参考。

- (void)navigationController:(UINavigationController *)navigationController
   didShowViewController:(UIViewController *)viewController
                animated:(BOOL)animate
{
    if ([self respondsToSelector:@selector(interactivePopGestureRecognizer)])
{
        if (self.viewControllers.count > 1)
        {
            self.interactivePopGestureRecognizer.enabled = YES;
        }
        else
        {
            self.interactivePopGestureRecognizer.enabled = NO;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS 应用程序在 PushViewController 上冻结 的相关文章

  • 如何找到键盘未覆盖的视图部分(UIModalPresenationStyleFormSheet)?

    我有一个视图控制器 显示带有 UITextView 的视图 并且我想在键盘出现时调整视图的大小 以便 UITextView 不会被键盘覆盖 我几乎在所有情况下都可以正常工作 据我所知 仅当视图控制器以 ModalPresentationSt
  • 为什么performSegueWithIdentifier在viewDidLoad中不起作用?

    我试图在视图控制器上调用 viewDidLoad 后立即触发故事板转场 Segue 附加了一个标识符 当从链接到按钮或其他控件的方法内部调用时 它可以正常工作 但它在 viewDidLoad 内部不起作用 它只是默默地失败了 viewDid
  • 如何使用 Vapor 和 Leaf 将图像从浏览器上传到 Amazon S3?

    我已经设置了 AWS S3 存储桶 并且可以使用 Vapor 3 和 Postman 上传文件 PUT request 和标头 x amz acl public read 但我想从浏览器中执行此操作 我使用的是 leaf 那么如何从浏览器上
  • AppStore 提交:错误 ITMS-9000:“无效的捆绑结构 - 不允许二进制文件‘MyApp.app/BuildAgent’

    我陷入了以下错误 我根本不明白 错误 ITMS 9000 无效的捆绑结构 不允许使用二进制文件 MyApp app BuildAgent 您的应用程序可能只包含一个可执行文件 当我使用 Xcode 从 Archive 导出到 IPA 时 我
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • 有关 Swift 编译器选项的文档

    您好 我想开始在 Apple Swift 语言上运行一些微基准测试 然而 我觉得很难找到有关编译器优化的不同选项的适当文档 我读过很多关于其他人的语言微基准的问题和文章 但是如果能有一些关于该主题的可靠文档那就太好了 在最新的测试版中 使用
  • 无法在 Swift 中对闭包进行弱引用

    Update 我试着不弱化地写一下 好像也没有漏的情况 所以也许这个问题已经没有必要了 在 Objective C ARC 中 当你想让一个闭包能够在闭包内部使用它自己时 该块不能捕获对自身的强引用 否则它将是一个保留循环 因此您可以使闭包
  • iOS 中 NSDecimalNumber 的小数分隔符错误

    我尝试通过以下方式输出具有正确的小数分隔符的十进制数的描述 NSString strValue 9 94300 NSDecimalNumber decimalNumber NSDecimalNumber decimalNumberWithS
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • 如何让UITextView背景线与文字对齐?

    我正在尝试绘制 UITextView 的背景线 这是我用来画这些线的代码 CGContextBeginPath context CGContextSetStrokeColorWithColor context self horizontal
  • “预期的 ';'在 Swift 下的顶级声明符之后”

    我正在尝试将所有颜色设置在一个 Swift 文件中 该文件可以在我的整个应用程序中使用 下面的代码会导致 import Foundation import UIKit class DotColors let tsblueColor UICo
  • 如何向标准 UIButton 添加徽章? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否可以在标准中添加看起来标准的徽章UIButton 如果不支持半原生 那么实现此目的最简单的方法是什么 示例图片 这是 Sascha
  • UItextView 背景颜色 Linespacing 区域太

    我正在尝试在 UITextView 中复制文本突出显示 不是搜索文本突出显示 但我也被行间距的颜色所困扰 我该如何纠正这个问题 现在的情况 期望的结果 我已将以下属性添加到我的 UiTextview 的属性文本中 对于段落行间距 我使用了以
  • 如何在代码中编辑约束

    我有一个以 100 开始宽度限制的网页 当用户单击按钮时 我想将约束更改为 200 我试过这个 NSLayoutConstraint constrain NSLayoutConstraint constraintWithItem self
  • UIView 圆角 - Swift 2.0?

    我会尝试将一些项目更新到 Swift 2 0 我有一个视图 左上角有一个圆角 在 Swift 没有警告 没有错误 只是没有圆角 这就是它在 Swift let maskPath UIBezierPath roundedRect conten
  • 叠加 SKScene 未显示

    我正在尝试将 SKScene 覆盖在 SCNScene 上 当我在模拟器和 iPhone6 上运行我的应用程序时 overlayScene SKScene 按预期显示 但是当我尝试在 iPhone5 上运行它 尝试了 2 个不同的设备 时
  • Firebase ref.removeAllObservers() 是否也会递归删除子观察者?

    我看到了一些与此相关的问题 但没有一个真正证实了我的疑问 If I removeAllObservers 在父节点上 这是否也会递归地删除可能已附加在所有子节点和子节点的子节点等处的所有其他观察者 递归地 API 文档为removeAllO
  • 如何更改 SwiftUI 列表中分隔符的颜色?

    我在 SwiftUI 中创建了一个列表 我想更改颜色或删除分隔符 因为在 UIKit 中 我们可以轻松更改 TableView 中分隔符的颜色 下面是 SwiftUI 中列表的代码和 UI 图片 State private var user
  • 是否可以跨 2 个不同的 iOS 应用程序访问数据?

    假设我在 App1 中存储了一些 ID 数据 并希望在同一设备上的 App2 中访问它 平台上可以这样吗 如果没有的话有什么解决方法吗 您可以使用iOS 钥匙扣 http developer apple com library ios do
  • 更改 iOS7 中 UIAlertView 的字体大小

    我想更改alertView中消息文本和标题文本的字体大小 苹果网站上没有任何文档谈到这一点 但苹果在其子类注释中表示 UIAlertView 类旨在按原样使用 请参考以下链接 https developer apple com librar

随机推荐

  • 如何在每个测试的基础上更改模拟实现?

    我想通过扩展默认模拟的行为并在下一个测试执行时将其恢复到原始实现来更改每个测试基础上模拟依赖项的实现 更简单地说 这就是我想要实现的目标 模拟依赖 在单个测试中更改 扩展模拟实现 执行下一个测试时恢复到原始模拟 我目前正在使用 Jest v
  • 从源安装 R 包,无需更改 PATH (Windows)

    我正在尝试安装包rpart对于 Windows 7 上的 R 2 14 0 但我收到警告 包 rpart 不可用 对于 R 版本 2 14 0 所以我从包页面下载 tar gz 文件 我已经安装了 Rtools 但禁用了所有选项 包括更改
  • 什么是最好/非常好的元数据阅读器库?

    现在 我对从 MP3 文件 ID3 标签 读取数据特别感兴趣 但它能做的越多 例如图像中的 EXIF 就越好 而且不会影响 ID3 标签的读取能力 我有兴趣制作一个脚本来遍历我的媒体 现在是我的音乐文件 并确保文件名和目录路径与文件的元数据
  • F# 中什么是柯里化? [复制]

    这个问题已经存在了 可能的重复 函数式编程 柯里化 我正在这里阅读免费的 F Wikibook http en wikibooks org wiki F Sharp Programming 有一节解释了什么是偏函数 它说使用 F 你可以部分
  • Javascript 键码冲突:“右箭头”和“单引号”

    以下脚本执行其应该执行的操作 即它对 向左箭头 和 向右箭头 键做出反应 但是 由于键码冲突 它也会对单引号做出反应 它使得无法将该字符输入到输入字段中 对此可以采取什么措施吗
  • 使用Spring Batch在不同的数据源中写入

    对于一个项目 我需要处理一个表中的项目 并为 3 个不同的表生成 3 个不同的项目 所有 3 个项目都位于与第一个项目不同的第二个数据源中 该实施是通过 Oracle DB 使用 Spring Batch 完成的 我认为这question有
  • 矩阵和数组有什么区别?

    更广义的术语是什么 那么为什么 MATLAB 被命名为矩阵实验室呢 矩阵是表示维度空间线性变换的实用方法n到一个维度空间m以一个形式nxm标量值数组 以非常系统的方式进行线性代数运算也非常实用 可以在计算机上实现 例如如果矩阵A表示线性变换
  • 如何检测对 HTML5“下载”属性的支持?

    HTML5 中实现的新功能之一是download锚标记的属性 此属性的好处是 它为用户提供了下载在客户端应用程序中创建的内容的方法 例如图像 例如从画布转换而来 目前 对此功能的支持很差 所以我想知道如何检测浏览器中对此功能的支持 Use
  • Knockout JS“uniqueName”绑定 - 两个字段同名

    我正在使用 Knockout JS 创建一个编辑器 我正在使用 foreach 属性循环模型中的列表 tbody 我正在使用 JQuery 不显眼的验证 它需要一个 name 属性来验证 我想为两个字段分配相同的名称 以便能够输出验证消息
  • 在 C# 中执行 SQL 语句?

    大家好 我想执行我的 SQL 语句 但我遇到语法问题 有人可以帮助我理解我做错了什么吗 谢谢 阿什 public void AddToDatabase string WordArray int Good int Bad int Remove
  • 如何在 IIS 上使用 django 获取静态 CSS 文件?

    我在 IIS8 上安装了 django 现在我想将其配置为提供静态文件 我一直在关注本教程 我已将其添加到设置 py STATIC URL 静态 STATIC ROOT C my django project NZtracker stati
  • UIScrollView 内的 UIDatePicker 与页面

    我有一个包含 2 个页面的 UIScrollView 我可以在它们之间水平滚动 但是 在我的其中一个页面上 我有一个 UIDatePicker 并且滚动视图正在拦截垂直触摸事件 因此我无法再操作日期选择器 除非通过单击或点击 有没有办法告诉
  • 如何在 Mac 上使用 Visual Studio Code 将 Azure 发布设置文件导入到 Angular 项目?

    我已经使用 Visual Studio Code 构建了一个 Angular 应用程序 并被指示使用提供的 publishsettings 文件将其部署到 Azure 我实现这一目标的尝试失败了 除了 publishsettings 文件和
  • PHP - 无法访问外部 URL

    由于流量很大 我最近升级了网站的服务器 在新服务器上 PHP 的某些方面似乎被破坏了 我有一个非常具体的代码 但不起作用 但是 由于版权原因 我只能向您展示非机密的等效内容 这段代码有效绝对完美在升级之前 现在这里或那里的一些奇怪的设置阻止
  • 如何在 C# 中将图像覆盖或叠加到视频上

    我试图弄清楚如何在 Visual C 中将图像覆盖在 保存的文件 视频上 然后重新保存它 在过去的四个小时里 我一直在努力做到这一点 到处寻找 所以任何帮助将不胜感激 DirectShow NET 是 DirectShow 的包装器 Dir
  • UIViewController 自由格式尺寸问题

    我正在使用这个神奇的 PopupViewController https github com martinjuhasz MJPopupViewController 控制 我的应用程序使用故事板 我已经按照开发人员的指示创建了一个自定义 S
  • 提取双引号之间的字符串

    我正在阅读来自期刊或论文来源的响应 并且我将 html 响应作为字符串 如下所示 一些人认为 梦表达了 人格的深刻方面 Foulkes 184 尽管其他人不同意 我的目标只是从给定字符串中提取所有引号并将它们保存到一个列表中 我的方法是 m
  • 如何使用JAVA向COM PORT发送数据? [复制]

    这个问题在这里已经有答案了 可能的重复 Windows 上的 Java 串行通信 朋友们 我想在JAVA中连接并传输数据到COM PORT 虚拟的或原始的 这个问题已经被问过并回答过很多次了 使用Java从串口读取文件 Java读取串口 J
  • 如何编译Boost多线程程序?

    我安装了boost库 没有多线程 一切都很顺利 我如何编译这个测试程序 include
  • iOS 应用程序在 PushViewController 上冻结

    我的导航控制器在按下时会间歇性冻结 它似乎将新的视图控制器添加到堆栈中 但动画从未发生 我还有另外两个容器 它们在屏幕上保存视图控制器 并且在导航控制器冻结后我可以与它们进行良好的交互 真正有趣的是 如果我尝试将另一个视图控制器推送到导航控