XIB-файл не загружается из фреймворка - PullRequest
0 голосов
/ 14 мая 2019

Я создал Cocoa Touch Framework, где я создал UIViewController класс, который имеет пользовательский интерфейс в xib файле. Я сделал обязательное связывание между XIB и файлами контроллера, такими как владелец файла, подключающийся к классу контроллера.

Я создал еще один xib и файлы контроллера в отдельном проекте как обычное приложение ios. Там я попытался представить этот ViewController, он показывался на экране, но когда я попытался загрузить контроллер, присутствующий в платформе, на экран выводился только черный экран.

Я добавил xib файлов в copy bundle resources части build phases в xcode. Но когда я устанавливаю фреймворк локально, я могу видеть только файл контроллера вместе с другими swift файлами, но не xib.

let oPController  = OPController()

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

Следует ли соблюдать особую осторожность, если фреймворк содержит xib файлов?

Примечание Когда я смотрю на установленные модули в проекте, я не вижу там никаких файлов xib.

Ответы [ 2 ]

0 голосов
/ 14 мая 2019

Когда вы создаете любые контроллеры ViewController с использованием XIB в вашей платформе.Вы должны сделать следующее.

  1. Убедитесь, что вы добавили xib в качестве ресурсов в файл podspec в случае библиотеки cocoapod.

  2. Asсогласно ответу Султана, который я тестировал, когда какой-либо класс UIViewController загружается динамически с использованием xib, и этот класс присутствует в некоторой структуре, тогда вы должны явно указать контекст связки при динамической загрузке класса

Звоните вот так

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")
    }
}
0 голосов
/ 14 мая 2019

Попробуйте добавить это в файл 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)
}
...