让@IBDesignable UIView绘制而不会崩溃Interface Builder

时间:2017-05-29 03:10:00

标签: ios swift uiview xib ibdesignable

我正在尝试在界面构建器中配置自定义UIView并获取要呈现的视图。每次我尝试使用自定义Xib执行此操作时,我都可以在界面构建器中使xib看起来很好,但是当我尝试将MyCustomView放入界面构建器中的UIVewController时,我得到了各种编译器错误。

我看过的每个教程都是这样的:“只需在你的班级声明前添加@IBDesignable,然后将@IBInspectable放在你的vars面前,然后观察魔术的发生”(例子:WWDC 2015 video)。或者是Objective-C,或者是Aramaic的30分钟视频,带有中文字幕等。

我的最终目标是能够将UIView拖入,在身份检查器中分配我的自定义类,并让xib的内容填充我拖入的UIView,并能够调整@IBInspectable属性。

我寻找答案的地方:

SO Post: @IBDesignable crashing agent

NS Hipster

A Medium Post

我得到的错误:

  

Base.lproj / Main.storyboard:错误:IB Designables:渲染失败   并更新PlaylistViewController(o1G-QR-OwX)的自动布局状态:   代理人崩溃了

     

Base.lproj / Main.storyboard:错误:IB Designables:无法更新   自动布局状态:代理崩溃

CurrentlyPlayingView的身份检查员: enter image description here

我收到上述错误后的观点故事板: enter image description here

我想要出现在上面故事板底部的视图:

enter image description here

我的代码:

import UIKit

@IBDesignable class CurrentlyPlayingView: UIView {

    var view = UIView()

    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var subtitleLabel: UILabel!
    @IBOutlet weak var progressSlider: UISlider!

    // IBInspectable attributes

    @IBInspectable public var titleLabelColor: UIColor = .black {
        didSet {
            self.titleLabel.textColor = titleLabelColor
        }
    }

    @IBInspectable public var subtitleLabelColor: UIColor = .black {
        didSet {
            self.subtitleLabel.textColor = subtitleLabelColor
        }
    }

    @IBInspectable public var sliderMinColor: UIColor = .blue {
        didSet {
            self.progressSlider.minimumTrackTintColor = sliderMinColor
        }
    }

    @IBInspectable public var sliderMaxColor: UIColor = .red {
        didSet {
            self.progressSlider.maximumTrackTintColor = sliderMaxColor
        }
    }

    // MARK: - Initialization

    override init(frame: CGRect) {
        super.init(frame: frame)
        xibSetup()
        initialConfig()
    }

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

    private func initialConfig() {
        self.titleLabel.textColor = titleLabelColor
        self.subtitleLabel.textColor = subtitleLabelColor
        self.progressSlider.minimumTrackTintColor = sliderMinColor
        self.progressSlider.maximumTrackTintColor = sliderMaxColor
    }

    // MARK: - Nib handlers

    private func xibSetup() {
        view = loadViewFromNib()
        view.frame = bounds

        // Make the view stretch with containing view
        view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight]

        // Adding custom subview on top of our view (over any custom drawing > see note below)
        addSubview(view)
    }

    private func loadViewFromNib() -> UIView {
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: "CurrentlyPlayingView", bundle: bundle)

        // Assumes UIView is top level and only object in CustomView.xib file
        let view = nib.instantiate(withOwner: self, options: nil).first as! UIView
        return view
    }
}

如果你已经做到这一点,谢谢你的阅读。如果你看到我所缺少的,我欢迎你的建议。

1 个答案:

答案 0 :(得分:1)

我认为这是因为您错过了prepareForInterfaceBuilder功能。

覆盖此功能,就像这样。

override func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        //setup your view with the settings
    }

OP附录:

UIView拖到YourViewController并将其在Identity Inspector中的自定义类设置为YourCustomView后,请确保选中“从目标继承”(从Xcode 8.x开始)