首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Swift包管理器-故事板捆绑包

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

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

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

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

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

尝试:

代码语言:javascript
运行
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
运行
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
运行
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
运行
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
运行
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
运行
AI代码解释
复制
.target(
   name: "HelloWorldProgram",
   dependencies: [], 
   resources: [.process(Images), .process("README.md")]
)

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

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

https://stackoverflow.com/questions/58000140

复制
相关文章
注册广播接收器registerReceiver
从registerReceiver(BroadcastReceiver receiver,IntentFilter filter)出发
全栈程序员站长
2022/11/17
1.1K0
Android基础总结(4)——广播接收器
  在Android中的每个应用程序可以对自己感兴趣的广播进行注册,这样该程序就只会接收自己所关心的广播内容,这些广播可能来自于系统的,也可能来自于其他应用程序的。Android提供了一整套完整的API,允许应用程序自由地发送和接收广播。发送广播就是借助之前了解过的Intent,接收广播则需要用到广播接收器(Broadcast Receiver)。. 1、广播的类型 标准广播:Normal broadcast,是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因
mukekeheart
2018/02/27
1.1K0
android广播注册方式_安卓广播接收器
前面分析了Android系统的广播机制,从本质来说,它是一种消息订阅/发布机制。因此,使用这种消息驱动模型的第一步便是订阅消息;而对Android应用程序来说,订阅消息其实就是注册广播接收器。
全栈程序员站长
2022/10/01
1.1K0
【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )
为 Thread 扩展 hello 方法 , 在该方法中传入 Closure 参数 , 在该方法中 , 执行传入的闭包参数 ;
韩曙亮
2023/03/30
8490
【Groovy】Groovy 扩展方法 ( 实例扩展方法配置 | 扩展方法示例 | 编译实例扩展类 | 打包实例扩展类字节码到 jar 包中 | 测试使用 Thread 实例扩展方法 )
Carson带你学Android:手把手教你学会广播组件-BroadcastReceiver
当此 App首次启动时,系统会自动实例化mBroadcastReceiver类,并注册到系统中。
Carson.Ho
2022/03/24
6680
Carson带你学Android:手把手教你学会广播组件-BroadcastReceiver
安卓开发_深入理解广播机制
一、Broadcast(广播) 在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。 (百度百科) 二、BroadcastReceiver(广播接收器) 1、自定义BroadcastReceiver 自定义广播接收器继承基
听着music睡
2018/05/18
1.5K0
Android四大组件:BroadcastReceiver史上最全面解析
BroadcastReceiver,本质上是一个全局的监听器,属于Android四大组件之一。
Carson.Ho
2019/02/22
1.9K0
Carson带你学Android:BroadcastRecevicer广播类型汇总
BroadcastReceiver(广播接收器),属于 Android 四大组件之一,在 Android 开发中,BroadcastReceiver 的应用场景非常多。今天,我将详细讲解关于BroadcastReceiver的所有广播类型,主要分为5类:
Carson.Ho
2022/03/24
5020
Carson带你学Android:BroadcastRecevicer广播类型汇总
类的实例化顺序
讲讲类的实例化顺序,比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,当 new 的时候,他们的执行顺序。 先说结论,顺序为: 父类静态变量、 父类静态代码块、 子类静态变量、 子类静态代码块、 父类非静态变量(父类实例成员变量)、 父类构造函数、 子类非静态变量(子类实例成员变量)、 子类构造函数。 代码举例说明: A.java public class A { int a1 = 8; static int a3 = getA3(); int a2 = getA
Li_XiaoJin
2022/06/10
1.3K0
Android 四大组件之BroadcastReceiver
Hi,大家好,又双见面啦,上一期我们讲了如何使用Activity,肯定有不少小伙伴已经创建了属于自己的FirstActivity,那么这一期我们主要为大家介绍第二个重要组件-BroadcastReceiver(广播接收器)。作为Android的四大组件之二,其应用场景非常多。下面,就详细介绍下 BroadcastReceiver 的相关知识。
下码看花
2019/09/02
1.5K0
Android 四大组件之BroadcastReceiver
基类、扩展类──页面重构中的模块化设计(五)
基类 和 扩展类 是这个系列的主要内容,上一篇《 模块化的核心思想──页面重构中的模块化设计(四) 》中只是简单提了一下,我们再深入的来了解下它们。
GhostZhang
2022/08/21
7380
基类、扩展类──页面重构中的模块化设计(五)
WPF如何在子线程或其他类中操控控件
一开始使用WPF界面的时候,会有这样的需求就是在后台更新控件,以完成列表更新,计时器,进度条等功能,但WPF这边架构限制,决定子线程是不安全的,如果创建子线程直接操作控件就会出错。
zls365
2021/03/16
2K0
Python科学计算扩展库numpy中的广播运算
首先解答上一个文章Python扩展库numpy中的布尔运算中的问题,该题答案为[111, 33, 2],题中表达式的作用是按列表中元素转换为字符串后的长度降序排序。 ---------------------分割线------------------ numpy中的广播运算使得两个不同形状(但也有基本要求,不是任何维度都可以广播)的数组进行运算,较小维度的数组会被广播到另一个数组的相应维度上去,可以简化代码的编写(例如不需要编写循环)。 >>> import numpy as np # 列向量 >>> a
Python小屋屋主
2018/04/16
1.2K0
Tip | Android的Service相关知识提炼
onCreate():服务第一次被创建时调用 onStartComand():服务启动时调用 onBind():服务被绑定时调用 onUnBind():服务被解绑时调用 onDestroy():服务停止时调用
凌川江雪
2019/07/03
6580
Tip | Android的Service相关知识提炼
Android基础_1 四大基本组件介绍与生命周期
    Android四大基本组件分别是Activity,Service(服务),Content Provider(内容提供者),BroadcastReceiver(广播接收器)。
shirayner
2018/08/10
1.6K0
Android基础_1    四大基本组件介绍与生命周期
Android四大组件详解
Android四大组件详解 Activity(活动) 概念 Service(服务) 概念 定义与作用 Content Provider(内容提供器) 介绍 作用 系统的Content Provider 自定义Content Provider Broadcast Receiver广播 概述 广播的作用 广播接收者的创建 广播接收者的类型 注册广播的两种方式 静态注册和动态注册的区别 有序广播和无序广播的区别 有序广播接收者们的优先级 有序广播的拦截和篡改 简单介绍:Android四大核心组件指的是 Acti
是阿超
2022/11/23
5.9K0
给系统类扩展属性(枚举)或方法
在这里我以UIButton为例子给大家展示一种实现方法,主要依靠runtime实现。废话不说上码... 1.扩展一般属性NSString @interface UIButton (CJButtonType) @property (nonatomic, strong) NSString *typeString; @end /////////////////////////////////////////////// #import "UIButton+CJButtonType.h" #import <objc
developerbfl
2018/06/05
9920
Android开发笔记(八十)运行状态检查
大家都知道刻舟求剑的寓言故事,说的是事物是发展变化着的,如果拘泥于原来的情况,那随着情况的改变,就不会得到预期的结果。同样,影响app运行的因素,并不只是外部环境(如硬件、系统、权限等等),还包括app自身的运行信息。如果app的运行状态发生了变化,那么原先处理正确的逻辑也可能处理失败,所以在特定的情况下,我们得对app的运行情况进行检查。
aqi00
2019/01/18
6270
动态注册广播接收器_ip广播系统软件v2.3说明书
从registerReceiver(BroadcastReceiver receiver,IntentFilter filter)出发
全栈程序员站长
2022/10/01
7200
[C#] 在类里实例化自身的应用实例<上位机通信>
比如上位机需要做Modbus的通信.B/S架构,事先不知道有多少个链接.有需要是时候才实例化并保存通信连接...
科控物联
2022/03/29
3K0
[C#] 在类里实例化自身的应用实例<上位机通信>

相似问题

实例化内部广播接收器类

12

广播接收器不启动活动

11

广播接收器在活动中不工作

10

实例化服务类和广播类的异常

10

服务或广播接收器

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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