Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Swift包管理器-故事板捆绑包

Swift包管理器-故事板捆绑包
EN

Stack Overflow用户
提问于 2019-09-18 20:13:43
回答 5查看 2.5K关注 0票数 14

我正在尝试在您的一个具有故事板的项目中添加对SPM的支持。

目前我们抓住它的UIStoryboard(name: String, bundle: String?),但这似乎不适用于扫描探针显微镜,因为没有真正的捆绑。即使打印所有包,也不能显示包的包。

我们有没有办法支持故事板,或者SPM仅仅是文件?

尝试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
UIStoryboard(name: "GiftCards", bundle: Bundle(for: self))
UIStoryboard(name: "GiftCards", bundle: Bundle(for: type(of: self)))
UIStoryboard(name: "GiftCards", bundle: Bundle(identifier: "com.x.x"))
EN

回答 5

Stack Overflow用户

发布于 2020-09-22 08:39:42

从Xcode12.0开始,这种方式可以正常工作,但是需要一些额外的步骤才能完成。

场景:

Swift

  • 应用程序显示名为BadgeKit.storyboard

的包中嵌入的序列图像板

  • 包名称为BadgeKit Package.swift header // swift-tools-version:5.3或更高版本的
  • BadgeKit中的序列图像板

目标:

  • 在应用程序情节提要中添加情节提要引用,并使其在应用程序

中工作

步骤:

将序列图像板引用添加到应用程序序列图像板,并按如下方式进行配置:

具有序列图板值BadgeKit和束标识符BadgeKit-BadgeKit-resources的序列图板引用属性面板。

Xcode使用以下格式自动生成一个包(及其标识符),用于保存在SPM包中找到的资源:[package name]-[package target name]-resources。在我们的例子中,包名和目标名是相同的(BadgeKit)。

虽然SPM资源包总是在构建过程中创建并包含在应用程序中,但它们不会在运行时在包之外自动可用。如果你没有在代码中的任何地方导入和使用包的目标,Xcode会试图通过不加载包的资源包来进行优化(这可能是Apple的一个疏忽,仅仅是故事板引用不足以触发这一点)。因此,如果您只在故事板中使用SPM包的资源,则需要一个变通方法来诱使Xcode使SPM包的包可用。

将此代码添加到应用程序的AppDelegate.swift文件中作为解决方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@UIApplicationMain final class AppDelegate: UIResponder {

    []

    override init() {
        super.init()
        
        // WORKAROUND: Storyboards do not trigger the loading of resource bundles in Swift Packages.
        let bundleNames = ["BadgeKit_BadgeKit"]
        bundleNames.forEach { (bundleName) in
            guard
                let bundleURL = Bundle.main.url(forResource: bundleName, withExtension: "bundle"),
                let bundle = Bundle(url: bundleURL) else {
                preconditionFailure()
            }
            bundle.load()
        }

        []
    }

    []

}

在我们的示例中,数组bundleNames包含一个字符串,该字符串对应于我们的包将在构建过程中为其资源创建的包的预期文件名。Xcode自动命名这些包文件,如下所示:[package name]_[package target name].bundle。请注意,包的文件名与其标识符不同。

如果您对哪些包(及其对应的标识符)在运行时加载并可用感到好奇,您可以使用以下代码进行故障排除:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let bundles = Bundle.allBundles
bundles.forEach { (bundle) in
    print("Bundle identifier loaded: \(bundle.bundleIdentifier)") }
}

在SPM BadgeKit包中配置序列图像板:

使用SPM包目标名称("BadgeKit")

  • Uncheck“Inherit

  • from target”

填充“模块”。

票数 11
EN

Stack Overflow用户

发布于 2021-01-20 08:33:45

关键是在实例化情节提要时使用Bundle.module

1-将此视图控制器扩展添加到swift包中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public extension UIViewController{
        
        public static func getStoryboardVC() -> UIViewController { 
            let storyboard = UIStoryboard(name: String(describing: self), bundle: Bundle.module) // Use Bundle.module
            return storyboard.instantiateInitialViewController()!
        }
 }

Bundle.module表示包含的包。

2-在应用程序中,在我的例子中,swift包被称为MySwiftPackage。我从swift包中调用扩展方法来实例化我想要呈现的视图控制器:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   @IBAction func openCard(){
        let vc = MySwiftPackage.MyViewController.getStoryboardVC() as! MySwiftPackage.MyViewController
        vc.personNo = "11111"
        vc.personId = "8888888"
        present(vc, animated: true, completion: nil)
    }
票数 8
EN

Stack Overflow用户

发布于 2020-05-22 17:40:18

从Swift 5.3开始,多亏了SE-0271,你可以通过在你的.target声明上添加resources来在swift包管理器上添加包资源。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.target(
   name: "HelloWorldProgram",
   dependencies: [], 
   resources: [.process(Images), .process("README.md")]
)

如果你想了解更多,我在medium上写了一篇文章,讨论了这个主题

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58000140

复制
相关文章
Swift入门:闭包
到目前为止,您已经遇到了整数、字符串、双精度数、浮点数、布尔值、数组、字典、结构和类,但是还有另一种类型的数据在Swift中广泛使用,它被称为闭包。这些是复杂的,但它们是如此强大和富有表现力,它们在 Cocoa Touch 广泛使用,所以如果你不了解他们,你不会走得很远。
韦弦zhy
2020/03/19
5490
Swift学习:闭包
本篇将详细总结介绍Swift闭包的用法; 闭包是自包含的函数代码块,可以在代码中被传递和使用。Swift中的闭包与C和 Objective-C中的代码块(blocks)以及其他一些编程语言中的匿名函数比较相似。
梧雨北辰
2018/08/09
8610
Swift之闭包
Swift 是一门由Apple 公司开发的用于iOS和OSX设备上的开发语言,吸收了很多现代开发语言的优势。 今天看了官方的关于闭包部分的文档,感觉很不错,记录一下。
EltonZheng
2021/01/26
1.7K0
使用 Swift Package Manager 创建 Swift 包
image.png Using the Package Manager 官网 https://swift.org/getting-started/#using-the-package-manager 进入准备创建 Swift 包文件位置 image.png 创建新的Swift包,首先要创建并输入一个名为的目录 perfect-Qiniu: image.png 进入刚才创建的 perfect-Qiniu 文件
LeeCen
2018/10/11
1.4K0
使用 Swift Package Manager 创建 Swift 包
Swift教程(七)--闭包
闭包是可以在你的代码中被传递和引用的功能性独立模块。Swift 中的闭包和 C 以及 Objective-C 中的 blocks 很像,还有其他语言中的匿名函数也类似。
roc
2019/07/31
7710
Swift系列八 - 闭包
要想使用exec函数,则必须传入两个Int类型的参数和一个返回Int类型的函数,然后exec内部执行了传入的函数。
呆呆
2021/05/27
4300
Swift-闭包(一)
array.sort{(n1:Int,n2:Int) -> Bool in return n1<n2}
Wilbur-L
2021/03/18
4460
swift的闭包结构
函数的设计思路是将有一定功能的代码块包装在一起,通过函数名实现复用。闭包和函数有着类似的作用,然而闭包的设计大多数情况下并不是为了代码的复用,而是传递功能代码块和处理回调结构。 如下代码所示,使用了冒泡排序算法来进行排序操作。 func mySort(array:inout Array<Any>,sortClosure:(Int,Int)->Bool)->Array<Any> { for indexI in array.indices {
用户2554571
2018/07/19
5630
Swift中的闭包(Closures)
闭包是自包含的函数代码块,可以在代码中被传递和使用。 Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些编程语言中的 lambdas 函数比较相似。
EltonZheng
2021/01/22
2K0
苹果现已支持 Swift 包索引
作者 | Sergio De Simone 译者 | 马可薇 策划 | 丁晓昀 Dave Verwer 和 Sven A. Schmidt 于三年前(2019 年)创建了 Swift 包索引,目的为让 Swift 开发者能够轻松地搜索发现 Swift 包。目前该项目已正式获得苹果的赞助,使其成为 Swift 包相关事宜的官方网站。 顾名思义,Swift 包索引并不是完整的软件包仓库,而是专注于为软件包元数据编制索引,为开发者们在决定项目要使用的软件包时提供其完善的信息。 其所能回答的问题包括:某个
深度学习与Python
2023/04/21
4520
苹果现已支持 Swift 包索引
Swift 基于闭包的类型擦除
与许多其他语言相比,使Swift更加安全,更不易出错的原因之一是其先进的(并且在某种程度上是不容忍的)类型系统。这是一种语言功能,有时可能会给人留下深刻的印象,使您的工作效率提高很多,而有时却令人沮丧。
Swift社区
2021/11/26
1.2K0
【Swift4】(6) 闭包 | 闭包应用 | 闭包作为函数参数 | 捕获特性
前端修罗场
2023/10/07
1930
Swift 闭包支持隐式 self
在 closure 捕获列表中,如果显式捕获self,则在 closure 使用时,则允许隐式使用self。即在 closure 捕获列表中声明[self], 则 closure 内调用self.的地方都可以不用书写该self.。这个特性在SE-0269中提议。现在本篇提议想把这个特性支持扩展到weak self的捕获上,并允许隐式self和已解包的self一样使用。效果就是如果在 closure 内 self 已经解包,则 closure 内调用 self 的地方可以不用写 self。如下例的dismiss方法调用:
DerekYuYi
2022/11/09
1.4K0
Swift-day4---闭包(Closures)
闭包写在一对大括号中,用 "in"关键字分隔,"in"后的语句是闭包的主体."in"之前的参数和返回值类型是语句组中所使用的参数和返回值格式的一种指示,并不必在语句组中进行逻辑运算和返回.闭包的表达式的运算结果是一种函数类型,可以作为表达式,函数参数和函数返回值
CC老师
2023/03/23
6310
Swift-day4---闭包(Closures)
包资源管理器NPM
NPM全称Node Package Manager,他是node包管理和分发工具。其实我们可以把NPM理解为前端的Maven .
名字是乱打的
2021/12/22
9650
Swift 基于闭包的类型擦除
与许多其他语言相比,使Swift更加安全,更不易出错的原因之一是其先进的(并且在某种程度上是不容忍的)类型系统。这是一种语言功能,有时可能会给人留下深刻的印象,使您的工作效率提高很多,而有时却令人沮丧。
韦弦zhy
2021/06/11
1.1K0
Swift 基于闭包的类型擦除
Swift讲解专题八——闭包 原
        Swift中的闭包是有一定功能的代码块,这十分类似于Objective-C中的block语法。Swift中的闭包语法风格十分简洁,其作用和函数的作用相似。
珲少
2018/08/15
3860
Swift进阶六——函数和闭包
形式参数,指的是是在函数的定义中,系统并没有为其分配内存空间、但是在函数里面可以使用的参数。比如下面的a就是形式参数:
拉维
2021/01/21
1.2K0
Swift3.0 - 函数和闭包
需求: 创建一个接口,输入true 返回 两个数相加的函数,输入false 返回两个数相减的函数
酷走天涯
2018/09/14
1.1K0
Swift3.0 - 函数和闭包
paletteer包:拥有2100多个调色板!
ggplot2是目前主流的绘图R包,有着丰富的扩展包。今天来推荐一个极其强大的配色R包——paletteer包。据R包作者介绍,这个包收集了52个R包的2100种调色板,R用户可以通过paletteer[1]包来直接调用其他R包的调色板。下面来学习下怎么使用这个R包[2]。
庄闪闪
2021/06/25
8.2K0
paletteer包:拥有2100多个调色板!

相似问题

从Swift包中测试故事板

11

故事板和故事板包的区别?

13

捆绑包ID的Swift包管理器问题

114

捆绑包资源访问Swift

12

无效的捆绑。iPad变形支持需要在包中发布故事板

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文