IBDesignable UI 未在 Xcode 9 和 Swift 中显示

IBDesignable UI is not showing in Xcode 9 with Swift

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

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

  2. 我创建了TestView.swift

  3. 我在自定义 Class

  4. 中使用 TestView 更新了 TestView.xib 的文件所有者
  5. 我将初始化代码添加到 testView.swift

里面的代码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. 并添加到 UIMainViewController 中的视图和 link 到具有自定义 class 名称的 TestView。

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

  3. 但是我的自定义 UI 没有显示在 xcode Image of xcode view controller
  4. 的 MainViewController 中

如何才能在 MainViewController 中看到我的自定义 UI?谢谢

在 InterfaceBuilder select 中您的 ViewController 并选择 "Editor-->Refresh all Views"。然后你的自定义视图应该出现。

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

prepareForInterfaceBuilder()只有在InterfaceBuilder中需要特殊设计外观才需要实现

有时需要清理项目和构建文件夹才能使其正常工作:
项目->清理
项目->(按住选项键)->清理构建文件夹

我刚刚更改了设置功能。它现在工作。 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
}

重写下面的两个函数:

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

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