从XIB加载视图并在Storyboard

时间:2016-07-29 10:56:01

标签: ios swift uiview storyboard xib

很长一段时间以来,我一直在使用xib个文件处理自定义视图。

在这种情况下,我需要做以下事情:

  1. 创建一个xib - 文件和swift - 文件,两者名称相同。
  2. 选择视图,将其自定义类设置为swift - file。
  3. 中的类
  4. 继续工作,并在需要时创建视图:

    public extension UIView {
    class func fromXib() -> UIView {
        return NSBundle.mainBundle().loadNibNamed(self.nameOfClass, owner: nil, options: nil).first as! UIView
    }
    
  5. 好的,它有效,没问题。但在不同的项目中,我开始更多地使用Storyboard。我希望自定义视图显示在那里,尽管它们是在xib - 文件中设计的(例如,当视图出现在多个屏幕上时,我会这样做。)

    所以,为了解决这个任务,我做了下一步:

    1. 创建一个xib - 文件和swift - 文件,两者名称相同。
    2. 我没有设置自定义类,而是将File's owner设置为swift - 文件类。 (因此我的视图类未设置,默认为UIView)。
    3. 我将以下代码添加到视图的生命周期方法中:

      required init?(coder aDecoder: NSCoder) {
          super.init(coder: aDecoder)
          setup()
      }
      
      override init(frame: CGRect) {
          super.init(frame: frame)
          setup()
      }
      
      func setup() {
          let v = NSBundle(forClass: self.dynamicType).loadNibNamed(self.nameOfClass, owner: self, options: nil).first as? UIView
          addSubview(v!)
          v?.frame = self.bounds
      }
      
    4. 我将视图标记为@IBDesignable
    5. 同样,一切正常,我在故事板的屏幕上添加了一个视图,将其类设置为我的自定义类,ta-daa,它在Interface Builder中呈现,并在我的应用程序的运行时加载。 / p>

      问题是:如何将所有内容连接在一起?如果我使用fromXib方法,应用程序会崩溃:Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<NSObject 0x7f9ea2d5b240> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key hoursLabel.

      如果我有办法双向加载视图,那将非常方便。

      提前致谢!

0 个答案:

没有答案