我无法理解我收到的UIKit崩溃报告:

有没有办法找出导致这个问题的代码行:

Crashed: com.apple.main-thread
0  UIKit                          0x195694264 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 444
1  UIKit                          0x1955d0950 _runAfterCACommitDeferredBlocks + 292
2  UIKit                          0x1955c29ec _cleanUpAfterCAFlushAndRunDeferredBlocks + 528
3  UIKit                          0x195336648 _afterCACommitHandler + 132
4  CoreFoundation                 0x18f1c09a8 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
5  CoreFoundation                 0x18f1be630 __CFRunLoopDoObservers + 372
6  CoreFoundation                 0x18f1bea7c __CFRunLoopRun + 956
7  CoreFoundation                 0x18f0eeda4 CFRunLoopRunSpecific + 424
8  GraphicsServices               0x190b58074 GSEventRunModal + 100
9  UIKit                          0x1953a9058 UIApplicationMain + 208
10 FlexConnect                    0x1001b48c8 main (AppDelegate.swift:20)
11 libdyld.dylib                  0x18e0fd59c start + 4

错误本身是:

崩溃:com.apple.main-thread

EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000010

编辑:

根据下面的答案,我想知道是否建议使用:

func topMostController() -> UIViewController {
    var topController: UIViewController = UIApplication.sharedApplication().keyWindow!.rootViewController!
    while (topController.presentedViewController != nil) {
        topController = topController.presentedViewController!
    }
    return topController
}

并且总是打电话

let topVC = topMostController().dismiss(animated: true,completion: nil)

在我的应用程序的任何地方,我目前有self.dismiss(动画:真,完成:零)?

这是一个必要的检查或如何确定self.dismiss有问题的地方?

一些样本解雇:

@IBAction func returnToDash(_ sender: UIButton) {
     self.dismiss(animated: true,completion: nil)
}

let pending = UIAlertController(title: "\n\n\n\(title)",message: nil,preferredStyle: .alert)
displayActivityAlertWithCompletion2(ViewController: self,pending: pending){_ in
   Helper_StatusCheck.doSync(_cleanSync: false){
        Prefs.is_Syncing = false
        dispatchQueue.main.async {
            pending.dismiss(animated: true){
                   Toast(text: "Upload sync completed").show()
                   self.dismiss(animated: true,completion: nil)
            }
        }
   }
}

displayActivityAlertWithCompletion2的位置如下:

public func displayActivityAlertWithCompletion2(ViewController: UIViewController,pending: UIAlertController,completionHandler: @escaping ()->())
{
    //let pending = UIAlertController(title: "\n\n\n"+title,preferredStyle: .alert)
    //create an activity indicator
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds)
    indicator.autoresizingMask = [.flexibleWidth,.flexibleHeight]
    indicator.color = UIColor(rgba: Palette.loadingColour)
    //add the activity indicator as a subview of the alert controller's view
    pending.view.addSubview(indicator)
    indicator.isUserInteractionEnabled = false
    // required otherwise if there buttons in the UIAlertController you will not be able to press them
    indicator.startAnimating()



    ViewController.present(pending,animated: true,completion: completionHandler)
}

编辑2:

我的应用程序中的一些示例popover方法:

@IBAction func search(_ sender: UIButton) {
        if let popView = UIStoryboard(name: "AssetCommon",bundle: nil).instantiateViewController(withIdentifier: "searchPop") as? searchPopVC {
            popView.delegate = self
            popView.modalPresentationStyle = .popover;
            popView.popoverPresentationController?.delegate = self
            popView.popoverPresentationController?.barButtonItem = searchButton
            popView.popoverPresentationController?.permittedArrowDirections = .any
            popView.preferredContentSize = CGSize(width: 300,height: 70)
            self.present(popView,completion: nil)
        }
    }

并搜索pop:

class searchPopVC: UIViewController
{
    @IBOutlet weak var searchBar: UISearchBar!

    weak var delegate: SearchPopDelegate?

    override func viewDidLoad()
    {
        super.viewDidLoad()

        searchBar.delegate = self;
    }

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

    @IBAction func performSearch(_ sender: UIButton)
    {
        let term = searchBar.text ?? "";
        delegate?.performSearch(with: term)
        self.dismiss(animated: true,completion: nil);
    }
}

extension searchPopVC: UISearchBarDelegate
{
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
        let term = searchBar.text ?? "";
        delegate?.performSearch(with: term);
        self.dismiss(animated: true,completion: nil)
    }
}
您将无法从此崩溃中找到代码行.但是,当您在动画完成之前从视图层次结构中删除用于调用dismiss(animated:completion :)的视图控制器时,会发生此崩溃.

根据代码的设置方式,您可以尝试请求更高的视图控制器来调用解雇.另一种解决方案可能是将视图控制器保留在属性中,直到您确定完成它为止.

编辑:1/5/18

在回应这些注释时,这里是一个示例,说明如何为记录事件和解散的视图控制器创建一个函数.

extension UIViewController {
    func dismissAndLog(animated: Bool,completion: (() -> ())? = nil) {
        // Here are two examples of how your view controller can be identified.
//        let id = title
        let id = String(describing: type(of: self))
        CLSLogv("dismissed View Controller: %@",getVaList([id]))

        dismiss(animated: animated,completion: completion)
    }
}

我并不完全熟悉Crashlytics或他们的API,因此如果此日志记录给您带来问题,您可以查看这些链接.

> https://docs.fabric.io/apple/crashlytics/enhanced-reports.html#custom-logging-in-swift
> How to use Crashlytics logging in Swift?

另外我不知道他们是如何向你提供数据的,所以我无法向你解释解析它的最佳方法.然而,时间戳肯定可以成功地用作最终解决方案.您还可以尝试通过电子邮件发送他们的支持,询问将这些日志映射到崩溃的最佳方法.

swift – 了解crashlytics UIKit错误的更多相关文章

  1. ios – 1天后firebase crashlytics报告中没有数据

    解决方法对于那些仍然有问题的人.检查您的podfile中是否还有pod’Firebase/Crash’.当我删除旧的Firebase崩溃报告时,我的问题已修复.

  2. ios – Xcode 6:在Fabric Crashlytics更新后找不到’Answers.h’文件

    我在Objective-C项目的Xcode6.3.2中的故事板中工作.我尝试构建时突然间出现错误:/…来看看我的变化,它只显示我所做的更改–这与Crashlytics无关.还有其他人看到这个吗?有人建议以最有效的方式恢复并重新开始工作吗?

  3. xcode – 崩溃更新后的未定义符号

    也许有人知道Xcode在哪里存储可以在编译和链接进程时使用的临时文件?更新该框架时,有人有类似的经验吗?

  4. ios – Fabric Crashlytics中缺少dSYM文件

    参见英文答案>Crashlytics:“We’remissingadSYMtoprocesscrashes”6从昨天起,我尝试在iOS应用程式中配置TwitterCrashlytics.我有一个问题wdSYMs文件.面料仪表板显示我的消息“我们缺少dSYMs文件”,所以我通过在线管理员上传文件(从此消息重定向),并显示此消息:但是如果我回到仪表板,系统丢失dSYMS文件的消息再次显示.我要做什么?

  5. ios – 将watchkit扩展添加到项目之后,以前添加的第三方框架不再起作用

    我有一个正在工作的应用程序,一切都很好.当我转到File->New->Target并添加一个watchkit应用程序/扩展名时,由于“Module”Crashlytics“找不到”,构建立即被破坏.目前,Crashlytics是使用@importCrashlytics访问的,我检查了项目,pbxproj文件具有引用到正确位置的crashlytics框架,Crashlytics.h在项目中可见.我尝试切换到#import“Crashlytics.h”,只是为了看看是否可能与模块有关,而不是简单地导入标题,但

  6. ios – “Fabric.framework / run”构建阶段实际上做了什么?

    我使用Crashlytics框架在iOSApps中进行崩溃收集.使用框架时,会在运行/Fabric/Fabric.framework/run的目标中添加“构建阶段”.

  7. ios – 将dSYM上载到崩溃的问题

    要将dSYM上传到crashlytics,我有以下设置,但无法上传dSYM.在我的目标–>构建阶段–>运行脚本在报告导航器在我的应用程序fabric.io仪表板缺少dSYM我失踪了解决方法如果您有位代码,因为您需要应用程序稀疏或TVOS或WatchOS应用程序,那么您在生成xcarchive时创建的dSYM不是所需的dSYM.这是因为苹果从位码重新编译.要获得真正的dSYM,请转到itunesco

  8. ios – 具有多个目标的方案 – > Crashlytics – >无法复制dSym文件

    我正在构建一个具有多个Archive目标的方案.如果我仅使用相应的方案构建每个目标,它就可以正常工作.但是,当我在一个方案中完全构建它们时,我从崩解剂中得到错误:有任何想法吗?

  9. swift – 了解crashlytics UIKit错误

    我无法理解我收到的UIKit崩溃报告:有没有办法找出导致这个问题的代码行:错误本身是:崩溃:com.apple.main-thread编辑:根据下面的答案,我想知道是否建议使用:并且总是打电话在我的应用程序的任何地方,我目前有self.dismiss?这是一个必要的检查或如何确定self.dismiss有问题的地方?

  10. 如何使用Fabric SDK强制Swift iOS应用程序崩溃?

    ,它说:我认为在Swift中会是这样但这似乎并不存在.(也许文档已经过时,不再适用,因为Fabric吞噬了Crashlytics?)我看到有一个Crashlytics.crash……

随机推荐

  1. Swift UITextField,UITextView,UISegmentedControl,UISwitch

    下面我们通过一个demo来简单的实现下这些控件的功能.首先,我们拖将这几个控件拖到storyboard,并关联上相应的属性和动作.如图:关联上属性和动作后,看看实现的代码:

  2. swift UISlider,UIStepper

    我们用两个label来显示slider和stepper的值.再用张图片来显示改变stepper值的效果.首先,这三个控件需要全局变量声明如下然后,我们对所有的控件做个简单的布局:最后,当slider的值改变时,我们用一个label来显示值的变化,同样,用另一个label来显示stepper值的变化,并改变图片的大小:实现效果如下:

  3. preferredFontForTextStyle字体设置之更改

    即:

  4. Swift没有异常处理,遇到功能性错误怎么办?

    本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请发送邮件至dio@foxmail.com举报,一经查实,本站将立刻删除。

  5. 字典实战和UIKit初探

    ios中数组和字典的应用Applicationschedule类别子项类别名称优先级数据包contactsentertainment接触UIKit学习用Swift调用CocoaTouchimportUIKitletcolors=[]varbackView=UIView(frame:CGRectMake(0.0,0.0,320.0,CGFloat(colors.count*50)))backView

  6. swift语言IOS8开发战记21 Core Data2

    上一话中我们简单地介绍了一些coredata的基本知识,这一话我们通过编程来实现coredata的使用。还记得我们在coredata中定义的那个Model么,上面这段代码会加载这个Model。定义完方法之后,我们对coredata的准备都已经完成了。最后强调一点,coredata并不是数据库,它只是一个框架,协助我们进行数据库操作,它并不关心我们把数据存到哪里。

  7. swift语言IOS8开发战记22 Core Data3

    上一话我们定义了与coredata有关的变量和方法,做足了准备工作,这一话我们来试试能不能成功。首先打开上一话中生成的Info类,在其中引用头文件的地方添加一个@objc,不然后面会报错,我也不知道为什么。

  8. swift实战小程序1天气预报

    在有一定swift基础的情况下,让我们来做一些小程序练练手,今天来试试做一个简单地天气预报。然后在btnpressed方法中依旧增加loadWeather方法.在loadWeather方法中加上信息的显示语句:运行一下看看效果,如图:虽然显示出来了,但是我们的text是可编辑状态的,在storyboard中勾选Editable,再次运行:大功告成,而且现在每次单击按钮,就会重新请求天气情况,大家也来试试吧。

  9. 【iOS学习01】swift ? and !  的学习

    如果不初始化就会报错。

  10. swift语言IOS8开发战记23 Core Data4

    接着我们需要把我们的Rest类变成一个被coredata管理的类,点开Rest类,作如下修改:关键字@NSManaged的作用是与实体中对应的属性通信,BinaryData对应的类型是NSData,CoreData没有布尔属性,只能用0和1来区分。进行如下操作,输入类名:建立好之后因为我们之前写的代码有些地方并不适用于coredata,所以编译器会报错,现在来一一解决。

返回
顶部