【问题标题】:XIB file not loading from frameworkXIB 文件未从框架加载
【发布时间】:2019-10-01 03:31:34
【问题描述】:

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

我在单独的项目中创建了另一个 xib 和控制器文件作为普通的 ios 应用程序。在那里,我尝试将这个 ViewController 呈现在屏幕上,但是当我尝试加载框架中存在的控制器时,只有黑屏出现在屏幕上。

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

let oPController  = OPController()

let oNav = UINavigationController(rootViewController: oPController)
controller.present(oNav, animated: true, completion: nil)

当框架包含xib 文件时,是否需要特别注意?

注意当我查看项目中已安装的 pod 时,我看不到任何 xib 文件。

【问题讨论】:

  • 你必须指定 Bundle 来加载 xib。当您使用不带参数的init 时,它将使用Bundle.main,在这种情况下这不是正确的。当然,框架包必须在构建期间正确复制。
  • 我必须在哪里做这个?
  • copy bundle resources 中有 xib 文件可以吗?
  • 你应该先试试OPController(nibName: nil, bundle: Bundle(for: OPController.self)。这应该确保 xib 是从正确的包中加载的。

标签: ios swift uiviewcontroller xib


【解决方案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)
}

【讨论】:

    【解决方案2】:

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

    1. 确保您已将 xib 添加为 podspec 文件中的资源,以防 cocoapod 库。

    2. 1234563 /p>

    这样称呼

    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")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-16
      • 2022-01-02
      • 1970-01-01
      • 2013-08-09
      • 2015-03-04
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多