【问题标题】:Segmentation fault: 11, xcode -12分段错误:11,xcode -12
【发布时间】:2021-02-16 15:15:57
【问题描述】:

该应用程序正在 xcode 11 上运行,但一旦我在 xcode 12 上运行它,它就会给出 Segmentation fault: 11 错误。

表单调试发现问题出在这个函数上,如果我注释代码它工作正常,对我来说似乎没有任何错误,有什么发生吗?

open func addViewController(_ vc:UIViewController)->Void{
    
    controllers.append(vc)
    
    // Setup the viewController view
    
    vc.view.translatesAutoresizingMaskIntoConstraints = false
    scrollview.addSubview(vc.view)
    
    // Constraints
    
    let metricDict = ["w":vc.view.bounds.size.width,"h":vc.view.bounds.size.height]
    
    // - Generic cnst
    
    vc.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[view(h)]", options:[], metrics: metricDict, views: ["view":vc.view] as [String: UIView]))
    vc.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[view(w)]", options:[], metrics: metricDict, views: ["view":vc.view] as [String: UIView]))
    scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]|", options:[], metrics: nil, views: ["view":vc.view] as [String: UIView]))
    
    // cnst for position: 1st element
    
    if controllers.count == 1{
        scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]", options:[], metrics: nil, views: ["view":vc.view] as [String: UIView]))
        // cnst for position: other elements
    } else {
        
        let previousVC = controllers[controllers.count-2]
        if let previousView = previousVC.view {
            // For this constraint to work, previousView can not be optional
            scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[previousView]-0-[view]", options:[], metrics: nil, views: ["previousView":previousView,"view":vc.view] as [String: UIView]))
        }
        
        if let cst = lastViewConstraint {
            scrollview.removeConstraints(cst)
        }
        lastViewConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-0-|", options:[], metrics: nil, views: ["view":vc.view] as [String: UIView])
        scrollview.addConstraints(lastViewConstraint!)
    }
}

【问题讨论】:

    标签: ios swift


    【解决方案1】:

    这样的部分代码

    let metricDict = ["w":vc.view.bounds.size.width,"h":vc.view.bounds.size.height]
    

    ,

    ["view":vc.view] as [String: UIView]
    

    ["previousView":previousView,"view":vc.view] as [String: UIView]
    

    可能会导致该问题,因此您可以尝试轻量级分段工作,以便编译器可以从中传递

    open func addViewController(_ vc:UIViewController)->Void{
        
        controllers.append(vc)
        
        // Setup the viewController view
        
        vc.view.translatesAutoresizingMaskIntoConstraints = false
        scrollview.addSubview(vc.view)
        
        // Constraints
        
        let metricDict:[String:CGFloat] = ["w":vc.view.bounds.size.width,"h":vc.view.bounds.size.height]
        
        // - Generic cnst
        
        let con:[String: UIView] = ["view":vc.view]
        
        vc.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[view(h)]", options:[], metrics: metricDict, views: con ))
        vc.view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[view(w)]", options:[], metrics: metricDict, views: con ))
        scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]|", options:[], metrics: nil, views: con ))
        
        // cnst for position: 1st element
        
        if controllers.count == 1{
            scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]", options:[], metrics: nil, views: con))
            // cnst for position: other elements
        } else {
            
            let previousVC = controllers[controllers.count-2]
            let relt:[String: UIView] = ["previousView":previousView,"view":vc.view]
            if let previousView = previousVC.view {
                // For this constraint to work, previousView can not be optional
                scrollview.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[previousView]-0-[view]", options:[], metrics: nil, views:relt ))
            }
            
            if let cst = lastViewConstraint {
                scrollview.removeConstraints(cst)
            }
            lastViewConstraint = NSLayoutConstraint.constraints(withVisualFormat: "H:[view]-0-|", options:[], metrics: nil, views: con)
            scrollview.addConstraints(lastViewConstraint!)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多