【问题标题】:PageViewController: SetViewController Crashes my AppPageViewController:SetViewController 使我的应用程序崩溃
【发布时间】:2015-12-27 01:44:36
【问题描述】:

当我运行我的应用程序时,我注意到setViewController 方法会导致内存链接并导致我的应用程序崩溃。我已经解决了这个问题几个小时,并尝试在网上查找,并找到了一个post,其中提到将我的 setViewController 方法放入 dispatch_async(dispatch_get_main_queue) 但这会终止应用程序,并且我在控制台中收到以下错误:

2015-12-26 19:41:55.596 Harish Yerra[4663:132796] XPC 连接中断 2015-12-26 19:41:55.596 Harish Yerra[4663:132797] 由于没有系统应用程序而终止。

iPhone 将完全重启并返回主屏幕。

我尝试注释掉setViewController 方法,我的应用程序很好地加载了页面视图控制器的第一页,然后当我滚动到下一页时它再次崩溃并出现以下错误:

* -[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:]、/BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.30.14/_UIQueuingScrollView.m 中的断言失败: 377 2015-12-26 19:31:55.058 Harish Yerra[4381:123817] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:[查看次数] == 3” *** 首先抛出调用堆栈: ( 0 CoreFoundation 0x000000010e411e65 异常预处理 + 165 1 libobjc.A.dylib 0x00000001105b0deb objc_exception_throw + 48 2 CoreFoundation 0x000000010e411cca + [NSException raise:format:arguments:] + 106 3 基础 0x000000010ea824de -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 198 4 UIKit 0x000000010f8d5575-[_UIQueuingScrollView _replaceViews:updatingContents:adjustContentInsets:animated:] + 289 5 UIKit 0x000000010f8d949d-[_UIQueuingScrollView _didScrollWithAnimation:force:] + 1350 6 UIKit 0x000000010f8d4701-[_UIQueuingScrollView layoutSubviews] + 176 7 UIKit 0x000000010f1444a3-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 703 8 QuartzCore 0x000000010ef4959a -[CALayer layoutSublayers] + 146 9 石英核心 0x000000010ef3de70 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 366 10 石英核心 0x000000010ef3dcee _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 24 11 石英核心 0x000000010ef32475 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 277 12 石英核心 0x000000010ef5fc0a _ZN2CA11Transaction6commitEv + 486 13 石英核心 0x000000010ef6e9f4 _ZN2CA7Display11DisplayLink14dispatch_itemsEyyy + 576 14 核心基础 0x000000010e371c84 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION + 20 15 核心基础 0x000000010e371831 __CFRunLoopDoTimer + 1089 16 核心基础 0x000000010e333241 __CFRunLoopRun + 1937 17 核心基础 0x000000010e332828 CFRunLoopRunSpecific + 488 18 图形服务 0x0000000112219ad2 GSEventRunModal + 161 19 UIKit 0x000000010f08d610 UIApplicationMain + 171 20 Harish Yerra 0x000000010d813efd 主要 + 109 21 libdyld.dylib 0x00000001115f092d 开始 + 1 ) libc++abi.dylib:以 NSException 类型的未捕获异常终止 (lldb)。

我将为我的viewDidLoad 提供代码,但如果您需要整个 PageViewControllerDataSource 的代码,请告诉我,我会提供。非常感谢您的帮助。

    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view.
    self.pageViewController = harishStoryboard.instantiateViewControllerWithIdentifier("HarishPageViewController") as! UIPageViewController
    self.pageViewController.dataSource = self
    let initialViewController = harishStoryboard.instantiateInitialViewController() as! HarishIntroduction
    let viewController = NSArray(object: initialViewController)
    dispatch_async(dispatch_get_main_queue(), {
        self.pageViewController.setViewControllers(viewController as? [UIViewController], direction: .Forward, animated: false, completion: nil)
    })
    self.pageViewController.view.frame = CGRectMake(0, 100, self.view.frame.size.width, self.view.frame.size.height-100)
    self.addChildViewController(pageViewController)
    self.view.addSubview(self.pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)
}

【问题讨论】:

  • 您是在真实设备上运行它吗? :O
  • 在真实设备或模拟器上运行时会发生同样的情况。
  • 请在 bugreport.apple.com 提交错误。在任何情况下,您的应用都不应导致系统崩溃!
  • 'NSInternalInconsistencyException',原因:'无效参数不满足:[views count] == 3' 表示您需要 3 个视图。所以你更新了主线程上的所有 UI?
  • @HAS 我想我发现了我的应用程序的问题,但即使是我也很困惑,因为整个系统崩溃了,即使在真实设备上运行我的 iPhone 也会重新启动。我开始在模拟器中运行我的应用程序,因为我害怕我会弄坏手机。我会提交一份错误报告,以便 Apple 知道某些代码可能会导致系统崩溃。

标签: ios swift uipageviewcontroller crash


【解决方案1】:

好的,非常感谢大家的帮助。但是,我想我发现了我的问题所在。我的第一个错误是没有将setViewControllers 方法放入dispatch_get_main_queue()。另外,this link 帮了我很多忙。它基本上告诉我在viewController.isKindOfClass 方法上使用if 语句来确定在pageViewController beforeViewControllerafterViewController 方法的dataSource 方法中正确导航到哪个视图。

我真的希望这篇文章能帮助任何可能与我有同样问题的人。不过,感谢您的帮助!

【讨论】:

    【解决方案2】:

    如果你想创建一个 UIPageViewController?你可以在你的 Xcode 中找到最好的细节!只需单击按钮“基于页面的应用程序”而不是“单视图应用程序”! Apple 已经获得了 Xcode 7.2 的最新更改,其中包含大量代码!祝你好运!

    【讨论】:

    • 是的,但我的应用程序只有一部分是 PageViewController,而不是全部。另外,我已经创建了我的应用程序的很大一部分,所以重新开始会很痛苦。但是,是否可以将一个 Xcode 项目导入另一个 Xcode 项目?
    • @Harish 您可以在另一个项目中选择基于页面的应用程序并将该视图控制器复制并粘贴到您当前的项目中
    • @AjinkyaPatil 好的,我会尝试,但唯一的问题是我已经完成了整个 PageViewController 设置的大部分工作。因此,我真的很想尝试解决问题,如果没有解决问题的解决方案,我将使用 Apple 提供的模板。
    猜你喜欢
    • 2011-05-26
    • 2013-08-20
    • 2021-08-28
    • 2012-05-09
    • 2010-11-08
    • 2014-01-24
    • 1970-01-01
    • 2015-12-21
    • 1970-01-01
    相关资源
    最近更新 更多