在UIViewController的子视图上初始化xib

时间:2016-07-21 13:52:09

标签: ios swift autolayout scrollview xib

当UITableView中没有显示任何内容时,我正在使用DZNEmptySet加载。它适用于DZNEmptySet的方法,如titleForEmptyDataSetimageForEmptyDataSet,但不适用于我想要使用的方法(customViewForEmptyDataSet)。

当我尝试将xib加载到scrollView.frame时,Xcode的内存开始以30兆字节的增量膨胀,应用程序挂起。我知道我有错,但我不知道我在搞什么。

我在这里看过很多答案和其他网站的教程,但我找不到适用于这种情况的解决方案(我觉得很简单)。任何有关该方面的反馈都将不胜感激。

customViewForEmptyDataSet

上的MyViewController
// App hangs on this and memory bloats in 30 megabyte increments.
func customViewForEmptyDataSet(scrollView: UIScrollView!) -> UIView! {
    return EmptySetView(frame: scrollView.frame)
}

这是我正在尝试初始化的EmptySetView的课程:

import UIKit

class EmptySetView: UIView {
    var view: UIView!
    // These are connected to a xib
    @IBOutlet weak var backgroundImageView: UIImageView!
    @IBOutlet weak var viewLabel: UILabel!
    @IBOutlet weak var viewTextView: UITextView!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setup()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setup()
    }

    func setup() {
        view = loadViewFromNib()
        view.frame = bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        self.addSubview(self.view)
    }

    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass:self.dynamicType)
        let nib = UINib(nibName: "EmptySetView", bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }
}

更新

Matt's suggestion,我调查了我遇到的递归并发现了问题的根源。

您没有在xib的视图上指定UIView类。而是单击标题为文件所有者的黄色多维数据集并在其中指定UIView,将类字段留空,在文档大纲面板中的视图上。

enter image description here

在清理缓存和重建之后,我可以使用在MyViewController上调用此代码的方式在层次结构中加载视图:

func customViewForEmptyDataSet(scrollView: UIScrollView!) -> UIView! {
    let emptySetView = EmptySetView(frame: scrollView.frame)
    return emptySetView
}

在加载xib之前,EmptySetView xib和MyViewController彼此不了解,因此您需要处理布局约束。

1 个答案:

答案 0 :(得分:1)

我的猜测是,在nib中加载顶级视图本身就是一个EmptySetView。这导致递归。首先在代码中实例化EmptySetView:

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

setup()中,您加载笔尖。但是这会导致从NIB再次实例化 EmptySetView。这次,另一个初始化程序被称为:

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

但是setup()加载了笔尖,所以我们现在绕圈子,试图将无数个加载笔尖的视图嵌入到彼此中,就像matrushka娃娃一样。