从 XIb 加载视图崩溃

Posted

技术标签:

【中文标题】从 XIb 加载视图崩溃【英文标题】:Load View from XIb crashes 【发布时间】:2017-02-16 10:27:03 【问题描述】:

我正在使用 xib 加载视图,但它总是崩溃。我尝试了网上可用的不同方法,但它仍然崩溃。我没有找到任何解决方案来处理。我附上了代码供参考Click here

【问题讨论】:

崩溃消息是什么? EXE_BAD_ACCESS 总是出现 【参考方案1】:

我检查了您的代码,问题是您会将视图类提供给文件所有者,并根据它更改 IBOutlets 和 IBActions。

所以第一件事就是将“CartView”提供给 FileOwner 并将其从视图中删除。

然后从手势中删除 IBAction,从 lbl 和 img 中删除 IBOutlets,然后再次分配将引用文件所有者。

【讨论】:

【参考方案2】:

你做错了。您已将 xib 和情节提要中的视图的类设置为 Cart。

尝试从 viewController 加载 nib 并将其添加为子视图。如果您需要将故事板中的小视图作为容器,只需创建一个插座并将卡片视图作为子视图添加到容器中。

【讨论】:

我认为这是从 xib 加载视图更合适的方法 好的,但是如果我想创建一个 IBDesignable 类怎么办。这样我必须从 Storyboard 继承它。 我认为不可能从 xib 设置 IBDesignable。您设置的图像不会反映在 IB 中 不,我说的是让类成为 IBDesignable 并在 Storyboard 的 ViewController 中设置它的子类。【参考方案3】:

您正在尝试像这样加载购物车

private func loadViewFromNib() -> UIView 
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "CartView", bundle: bundle)
        let nibView = nib.instantiate(withOwner: self, options: nil).first as! UIView
        return nibView
    

用它加载视图绝对没有问题。问题是您不应该在视图的类中加载视图。

您必须在 ViewController 中执行此操作。像这样:

func loadCartView() -> UIView! 
        if let customView = NSBundle.mainBundle().loadNibNamed("CartView", owner: self, options: nil).first as? CartView 
            customView.translatesAutoresizingMaskIntoConstraints = false
            return customView
         else 
            return nil
        
    

SWIFT3:

func loadCartView() -> UIView! 
    if let customView = Bundle.main.loadNibNamed("CartView", owner: self, options: nil)?.first as? CartView 
        customView.translatesAutoresizingMaskIntoConstraints = false
        return customView
     else 
        return nil
     
    

【讨论】:

Jason ,只是将 Cart 类添加到 File Owner 对我有用。无需在 VIewController 中添加。 我看到了你的代码。将 viewController 之外的视图作为子视图加载并不是一个好方法。 @Krishnanunni 也这么说。

以上是关于从 XIb 加载视图崩溃的主要内容,如果未能解决你的问题,请参考以下文章

从 XIB 加载时 UICollectionViewCell 导致崩溃

切换到 XCode 7.0(.1) 后,自定义视图 (XIB) 在发布模式下崩溃

从 Xib 加载视图在自动布局后调整框架子视图的大小

从xib加载视图的正确方法是啥?

从 xib 加载视图控制器返回错误的帧

从 xib 文件加载的自动调整视图大小