swift2 中 init(coder aDecoder:) 行的 EXC_BAD_ACCESS 错误

Posted

技术标签:

【中文标题】swift2 中 init(coder aDecoder:) 行的 EXC_BAD_ACCESS 错误【英文标题】:EXC_BAD_ACCESS error at init(coder aDecoder:) line in swift2 【发布时间】:2016-06-07 06:43:46 【问题描述】:

我不能完全理解我做错了什么。我尝试删除 optional(?) 但没有结果。

这是我的自定义视图的总代码:-

class CustomView: UIView 

    var vieww: UIView!

    override init(frame: CGRect) 
        super.init(frame: frame)
        setupView()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        setupView()
    

    func loadViewFromib () -> UIView 
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: NSStringFromClass(self.dynamicType).componentsSeparatedByString(".").last!, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil).first as! UIView
    
        return view
    

    func setupView() 
        vieww = loadViewFromib()
    
        vieww.frame = CGRectMake(0, 0, 300, 150)
        vieww.center = center
        addSubview(vieww)
    
        /// Adds a shadow to our view
        vieww.layer.cornerRadius = 4.0
        vieww.layer.shadowColor = UIColor.blackColor().CGColor
        vieww.layer.shadowOpacity = 0.2
        vieww.layer.shadowRadius = 4.0
        vieww.layer.shadowOffset = CGSizeMake(0.0, 8.0)
    

我是 swift 新手,不知道该怎么做。请帮帮我。

提前致谢。

【问题讨论】:

您需要通过包含 ? 将您的子类 init 方法标记为失败因为超类初始化器是失败的。 @Paulw11 您能否通过发布一些代码来详细说明。我对 swift 很陌生。 @Paulw11 正如您在我的问题中提供的第一张图片中看到的那样,我做了同样的事情,但仍然出现错误! 是的,抱歉,您的问题令人困惑。您应该发布代码而不是图像。该异常的最常见原因是某些东西为零。你是如何创建这个视图对象的? NSCoder 是从哪里来的? @Paulw11 我已经发布了我的完整代码。你能帮我找出解决办法吗? 【参考方案1】:

该错误是由于无限循环以及我没有为 CustomView 提供任何框架而引起的。我是在设置断点一步一步走的时候找到的。

这是解决方案(CustomView 中的代码):-

override init(frame: CGRect) 
    super.init(frame: frame)
    setupView()


required init?(coder aDecoder: NSCoder) 
    super.init(coder: aDecoder)
    setupView()


func setupView() 

  // do all your setup for your view here

在您的视图控制器中 ->

lazy var popupView :CustomView = 
    let popupView = CustomView(frame: CGRectMake(0,0,300,150))
    return popupView
()

这是一个来自堆栈溢出的链接,它消除了我所有的疑虑。

Fatal error: use of unimplemented initializer 'init(coder:)' for class

如果还有任何疑问,您可以参考http://www.edwardhuynh.com/blog/2015/02/16/swift-initializer-confusion/。这个博客肯定会清除你所有的疑惑。

希望有人觉得这些有用。

【讨论】:

【参考方案2】:

Inspector 下的Custom Class 中设置Module 解决了我的问题。您可以将模块设置为与自定义类或继承自的类相同。

【讨论】:

我迷茫了这么久!这真的很有帮助!!!

以上是关于swift2 中 init(coder aDecoder:) 行的 EXC_BAD_ACCESS 错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 为啥在 AFHTTPSessionManager 中需要 init(coder)?

Swift init 方法错误:声明 'init(coder:)' 不能覆盖多个超类声明

当我们可以在 awakeFromNib 中转储所有内容时,为啥还要使用 init(coder)?

自定义警报创建致命错误:init(coder:) 尚未实现

线程 1:致命错误:init(coder:) 尚未实现

Swift:错误:'必需'初始化程序'init(coder :)'必须由'UIView'的子类提供