使用Swift在Xcode 9中不显示IBDesignable UI

时间:2017-10-20 11:08:40

标签: ios swift uiview xcode9 ibdesignable

我尝试使用自定义xib文件。但是那些UI没有在xcode中的主视图控制器中显示。但它显示运行应用程序时。我已经在课堂上添加了@IBDesignable。这就是我做的。

  1. 我创建了TestView.xib并添加了一些设计

  2. 我创建了TestView.swift

  3. 我使用自定义类中的TestView更新了TestView.xib的fileOwner

  4. 我在testView.swift

  5. 中添加了初始化代码

    TestView.swift中的代码

    import UIKit
    
    @IBDesignable class DetailView: UIView {
    
    override init(frame: CGRect){
        super.init(frame: frame)
        self.setup()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)!
        self.setup()
    
    }
    
    func setup() {
        let view = Bundle.main.loadNibNamed("TestView", owner: self, options: nil)?.first as! UIView
        view.frame = self.bounds
        self.addSubview(view)
    }
    
    }
    
    1. 并在MainViewController中的UIView上添加,并使用自定义类名链接到TestView。

    2. 之后我运行应用程序,我可以从testView看到UI。 Image of emulator and result

    3. 但我的自定义用户界面不能在xcode Image of xcode view controller
    4. 中的MainViewController中显示

      如何在MainViewController中启用自定义UI?感谢

3 个答案:

答案 0 :(得分:5)

在InterfaceBuilder中选择您的ViewController并选择“Editor - > Refresh all Views”。然后你的自定义视图会出现。

如果出现问题,可以通过在代码中设置断点来调试IBDesignable类,然后选择“Editor - > Debug selected views”。

如果在InterfaceBuilder中需要特殊的设计外观,则只需要实现

prepareForInterfaceBuilder()

有时需要清理项目并构建文件夹以使其工作:
项目 - >清洁
项目 - >(按住选项键) - >清理构建文件夹

答案 1 :(得分:2)

我刚刚更改了设置功能。它现在正在运作。 Final Result Image - It showing UI in IB

func setup() {
    view = loadViewFromNib()
    view.frame = bounds
    view.autoresizingMask = UIViewAutoresizing(rawValue: UIViewAutoresizing.RawValue(UInt8(UIViewAutoresizing.flexibleWidth.rawValue) | UInt8(UIViewAutoresizing.flexibleHeight.rawValue)))

    self.addSubview(view)
}

func loadViewFromNib() -> UIView {
    let bundle = Bundle(for: type(of: self))
    let nib = UINib(nibName: "TestView", bundle: bundle)
    let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView
    return view
}

答案 2 :(得分:0)

实时覆盖以下两个功能:

override open func prepareForInterfaceBuilder() {
   layer.cornerRadius = cornerRadius
   layer.borderWidth = borderWidth
}

override open func awakeFromNib() {
   layer.cornerRadius = cornerRadius
   layer.borderWidth = borderWidth
}