【问题标题】:Not able to present UIViewController with its Storyboard in a Swift Package无法在 Swift 包中呈现 UIViewController 及其情节提要
【发布时间】:2021-04-18 18:51:58
【问题描述】:

我正在构建一个单独的功能作为 swift 包。包中有一个视图控制器及其故事板。我在实例化和呈现视图控制器时遇到问题。我收到此错误:

在捆绑包 NSBundle 中找不到名为“MyIdCardVC”的情节提要...

MyIdCardVC.swift 和 MyIdCardVC.storyboard 都被添加到包中。

这是 Package.swift 声明的一部分:

let package = Package(
name: "IDCard",
platforms: [
    .iOS(.v11)
],
products: [ 
    .library(name: "IDCard", targets: ["IDCard"]),
],

我正在从我的应用程序中展示包的视图控制器,如下所示:

import UIKit
import IDCard
 
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let vc = IDCard.MyIdCardVC.getStoryboardVC()
        present(vc, animated: true, completion: nil)
    }
 
}

“getStoryboardVC”是包中声明的静态扩展方法

public extension UIViewController{

public static func getStoryboardVC() -> UIViewController {

    let storyboard = UIStoryboard(name: String(describing: self), bundle: nil)
    return storyboard.instantiateInitialViewController()!
}

这里是 MyIDCardVC.storyboard 的外观:

【问题讨论】:

  • 在您的 getStoryboardVC 函数中,尝试指定一个捆绑包。您可以使用 NSBundle 的 init(for:)self.class 来获取特定 VC 的捆绑包。 Docs(对任何语法怪异表示歉意。我是 ObjC 人)。
  • 感谢您的建议,不幸的是我没有这样做: let bundle = Bundle(for: self) 。然后让 storyboard = UIStoryboard(name: String(describing: self), bundle: bundle)

标签: ios swift storyboard swift-package-manager


【解决方案1】:

我在实例化情节提要的视图控制器时使用Bundle.module 解决了这个问题。 Bundle.module 指的是包含包:

public extension UIViewController{
    
        public static func getStoryboardVC() -> UIViewController {
            let storyboard = UIStoryboard(name: String(describing: self),
 bundle: Bundle.module)// key part is Bundle.module
            return storyboard.instantiateInitialViewController()!
        }
 }

然后在应用程序中,我将包视图控制器呈现如下:

   @IBAction func openCard(){
        let vc = IDCard.MyIdCardVC.getStoryboardVC() as! IDCard.MyIdCardVC
        vc.personNo = "11111"
        vc.personId = "8888888"
        present(vc, animated: true, completion: nil)
    }

在情节提要中,指定模块并取消选中从目标继承模块

【讨论】:

    猜你喜欢
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    相关资源
    最近更新 更多