未从框架加载XIB文件

时间:2019-05-14 07:07:23

标签: ios swift uiviewcontroller xib

我创建了可可触摸框架,并在其中创建了UIViewController文件中的ui的xib类。我已经完成了xib和控制器文件之间的必要绑定,例如文件所有者连接到控制器类。

我已经像普通的ios app在另一个项目中创建了另一个xib和控制器文件。在那里,我尝试将ViewController呈现在屏幕上,但是当我尝试加载框架中存在的控制器时,只有黑屏出现在屏幕上。

我在xcode的xib的{​​{1}}部分中添加了copy bundle resources个文件。但是当我在本地Pod安装框架时,我只能看到控制器文件以及其他build phases个文件,而看不到swift个文件。

xib

当框架包含let oPController = OPController() let oNav = UINavigationController(rootViewController: oPController) controller.present(oNav, animated: true, completion: nil) 个文件时,需要特别注意吗?

注意:当我查看项目中已安装的Pod时,在那里看不到任何xib文件。

2 个答案:

答案 0 :(得分:0)

在框架中使用xib创建任何ViewController时。 您必须做这些事情。

  1. 确保使用cocoapod库时,已将xib作为资源添加到podspec文件中。

  2. 根据Sulthan的答案并进行了测试,当使用xib动态加载任何UIViewController类并且该类存在于某些框架中时,您必须在动态加载课

像这样打电话

let oPController = OPController(nibName: "OPController", bundle:
    Bundle(for:OPController.self))

此类类似于

class OPController : UIViewController {
    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

答案 1 :(得分:-1)

尝试将其添加到podspec文件

  s.source_files = "ReusableViewController/*.{swift,h,m,xib,storyboard}"
  s.resource_bundles = {
    'MyFramework' => ['Pod/Classes/**/*.{storyboard,xib,xcassets,json,imageset,png}']
  }
  s.exclude_files = "Classes/Exclude"
  s.swift_version = "4.0"

选中此链接可从框架加载xib文件

https://github.com/Ajithram007/reusableVC

let nibName: String = "SignInView"
var view: UIView!

public override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}
public required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

func setup() {
    self.view = UINib(nibName: self.nibName, bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil)[0] as! UIView
    self.view.frame = bounds
    self.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
    self.addSubview(self.view)
}