热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

iOS开发之创建框架

iOS开发之创建框架-theme:scrolls-light在本教程中,您将在iOS中为创建自定义日历控件中的开发人员的日历控件提取到一个单独的可重用框架中。在过程中,您将:

theme: scrolls-light

在本教程中,您将在iOS 中为创建自定义日历控件中的开发人员的日历控件提取到一个单独的可重用框架中。在过程中,您将:

  • 为CalendarControl*创建一个新框架。
  • 迁移现有代码。
  • 将所有内容导入应用程序。
  • 创建一个框架,XCFramework
  • 它把打包成一个便携的Swift超级包。
  • 为您的 Swift 包设置一个存储库并发布它。

完成后,在您使用开发的便携式应用程序运行时,XCFramework 程序将像以前一样

入门

使用本教程底部底部的“下载材料”按钮或下载最初和最终项目。找到项目文件夹。找到RWCalendarPickerUI并打开RWCalendarPicker.xcodeproj

RWCalendarPicker是一个类似的提醒清单应用程序,可以让用户创建任务并设置截止日期。

构建并运行以了解其工作原理。

查看RWCalendarPicker中的文件以该项目为主。CalendarControl的代码分为几个类:

  • Day.swift:一个数据模型,其中包含每天对象的数据。
  • MonthMetadata.swift:最近的数据模型。
  • CalendarDateCollectionViewCell.swift:使用集合视图中的单元格显示一个月中的天数。每个单元格都是在这里定制的。
  • CalendarPickerFooterView.swift:让用户选择不同的月份。
  • CalendarPickerHeaderView:当前显示月份和年份,swift用户关闭选择器并显示日期标签。
  • CalendarPickerViewController.swift:所有相关视图组合小说的日历主体。

什么是框架?

框架是独立的、可重复使用的代码和资源块,您可以将其导入到许多应用程序中。您甚至可以在 iOS、tvOS、watchOS 和 macOS 应用程序之间共享。当与 Swift 的访问控制结合时使用时,框架在代码模块之间定义强大的、可测试的接口。

框架有三个主要目的:

  • 封装代码
  • 代码初始化
  • 重用代码

如果你使用其他语言编程,你可能听说过节点模块、包、gem 或 jars。框架相当于 Apple 生态系统中的框架。SDK 中的一些常见 iOS 框架示例包括FoundationUIKitSwiftUICloudKitCombine

用 Swift 的话说,模块是一组编译后的代码,它们部署在上面。框架是一种模块,而应用程序是另一种。

创建框架

在 Xcode 中,Apple 引入了 Cocoa Touch 框架,最近将其创建框架如此简单的创建项目。首先,更改框架为您创建框架。

在 Xcode 中,选择File ▸ New ▸ Project...。然后选择iOS ▸ Framework & Library ▸ Framework

单击下一步,然后将产品名称设置为CalendarControl。使用您自己的组织名称组织名称。

点击下一步。在文件选择中,选择在2-Framework创建项目。然后点击创建

你现在有一个项目,虽然很无聊,但它创建了一个框架!

将源代码添加到框架中

您当前的状态是一个没有的框架。这与不加糖的纯巧克力一样吸引人。在本节中,您将通过将现有文件添加到框架来介绍代码。

RWCalendarPicker ,将*Day.swift*拖到Xcode中的CalendarControl项目。,智力。

仔细检查Day.swiftCalendarControl中是否有Target Membership,以确保它出现在最终框架中。通过选择此文件并确保在*File inspectors的*Target Membership区域中选择CalendarControl来验证这一点。

现在,按照上述步骤将这些文件添加到您的项目中:

  • MonthMetadata.swift
  • CalendarDateCollectionViewCell.swift
  • CalendarPickerFooterView.swift
  • CalendarPickerHeaderView.swift
  • CalendarPickerViewController.swift

将类代码分开它们的组中,这是组织到必须自己注意的,但好习惯。

在项目导航器中选择您的项目,然后在*Targets中选择*CalendarControl。打开设置。然后将Build Libraries for Distribution设置为y。这会生成一个接口模块文件,当Xcode中有人定义时跳转到您的模块时,该文件会显示您的公共 API。

制造框架项目。确保您在没有制造警告或错误的情况下获得制造成功。

将框架添加到项目

您已关闭日历控件。返回到日历中的日历框架到现在的纸框架中,不再需要项目中的迁移文件。删除。在确认中选择*至废*

  • Day.swift
  • MonthMetadata.swift
  • CalendarDateCollectionViewCell.swift
  • CalendarPickerFooterView.swift
  • CalendarPickerHeaderView.swift
  • CalendarPickerViewController.swift

项目。您看到看到几个可预见的消息的错误,Xcode 会显示会在不知道CalendarPickerViewController是什么。具体来说,您创建的范围错误中找不到“CalendarPickerViewController”。

您将通过添加CalendarControl框架项目来解决这些问题。

嵌入你的文件

现在,点击点击项目导航器中的节点RWCalendarPicker根。点击将文件添加到“RWCalendarPicker”

在文件选择器中,导航到2-Framework/CalendarControl并选择CalendarControl.xcodeproj。然后单击添加将其添加为子项目。

注意:将框架项目添加到应用程序中自己需要的。您可以添加CalendarControl.framework输出。

结合这些项目,可以同时更新框架和应用程序。您对框架和应用程序进行开发部署的任何项目都可以使用。

构建并运行。你会看到同样的编译错误!

即使这两个项目现在,RWCalendarPicker仍然没有拥有CalendarControl。就像他们坐在同一个房间里,但是RWCalendarPicker看不到新框架。

请按照以下步骤解决问题:

  1. 将更改为CalendarControl并制造它。
  2. 然后,以CalendarControl项目查看产品文件夹。
  3. 在下面寻找它。该文件是框架控制和日历代码、资源数据的框架项目的输出。
  4. 然后选择顶级RWCalendarPicker节点以打开项目编辑器。
  5. 点击RWCalendarPicker目标。然后转到*定期*选项卡。
  6. 下面到框架、库和嵌入内容部分。
  7. CalendarControl.framework从CalendarControl.xcodeproj的*产品*文件夹拖到这个部分。

您在Frameworks, Libraries and Embedded Content中为框架添加了一个目录。

现在应用程序知道了框架以及在哪里可以找到它。应该够了吧?

切换到RWCalendarPicker方案并制作项目。更多相同的错误。

您访问了框架开发的一个重要部分:访问控制。

访问控制

这些框架的代码是项目的一部分,但项目并不是它。眼不见,心不烦。

转到ItemDetailViewController.swift ,列表添加到文件顶部的导入中:

导入日历控件

这很关键,但这个包含的控制仍然不会修复构建错误,因为 Swift 使用访问来确定您是否确定对其他文件或模块的结构是显而易见的。

在这种情况下,Swift 使所有内容internal——仅在其自己的模块中可见。

要恢复应用程序的功能,您必须更新CalendarControl类的访问控制。

通过的有点乏味,但更新访问控制过程隐藏不应该出现在框架之外的代码来提高启动。您可以通过使某些函数不带访问符式显式声明它们来完成这一点internal

Swift 有几个等级的访问控制。创建自己的框架时,请使用以下规则:

  • 公开和公开:用于应用程序或其他框架调用的代码,例如自定义视图。
  • Internal:框架内部函数和类之间的,例如用于视图中的自定义代码层。
  • Fileprivate:用于在一个文件中使用的代码,例如计算高度的辅助函数。
  • Private:使用和声明中使用的相同代码,例如class声明文件中的不同块该扩展。

CalendarControlRWCalendarPicker应用程序的某个部分时,操作内部不是问题。现在它位于一个程序的单独模块中,您必须将其公开以供使用使用。将在下一节中执行此操作。

注意:如果您想了解有关访问控制的更多信息并了解和了解它们之间的区别openpublic请查看访问控制文档。

更新框架访问等级

打开CalendarPickerViewController.swift。通过将public关键字添加类定义来使类公开,如下所示:

公共类CalendarPickerViewController : UIViewController {

现在CalendarPickerViewController对导入CalendarControl框架的任何应用程序文件都是可见的。

public关键字添加到:

  • CalendarPickerViewController.init(baseDate:selectedDateChanged:)
  • CalendarPickerViewController.init(coder:)
  • CalendarPickerViewController.viewDidLoad()
  • CalendarPickerViewController.viewWillTransition(to:with:)
  • CalendarPickerViewController.collectionView(_:numberOfItemsInSection:)
  • CalendarPickerViewController.collectionView(_:cellForItemAt:)
  • CalendarPickerViewController.collectionView(_:didSelectItemAt:)
  • CalendarPickerViewController.collectionView(_:layout:sizeForItemAt:)

注意:您可能想知道为什么必须init公开。Apple 在其访问控制中了这一声明和其他文档中更精细的访问点。

现在你得到了你的CalendarControl 。

恭喜!您现在拥有一个工作的独立框架和一个使用它的应用程序!

发布 XCFramework

*您可能在2019 年*听说过 XCFramework。是的,对的:这是可以 Xcode 生成的框架是您在 WWDC 使用的框架。

在 219 年前你只有一次机会制作自己的框架,框架也称为通用静态库

为了支持架构,您的例如和设备的组合库,您必须将它们中的一个胖框架的下一个。但是,在此之后,框架再胖

归档你的框架

在本节中,您将与您的老朋友终端一起工作。呜呼!

打开终端并使用以下命令导航到框架文件夹。或者,您可以在 cd命令将项目文件夹拖到终端:

cd  "CreateFrameworkForiOS/starter/2-Framework"

开始为以下目标归档您的框架传送:

  • iOS
  • 下载
  • 苹果系统

在终端中输入从以下命令:

xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '通用/平台=iOS' \
-archivePath './build/CalendarControl.framework-iphoneos.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

此命令将使用以下列表作为输入生成框架的记录:

  1. -scheme CalendarControl:使用此方案进行归档。
  2. -configuration Release:使用发布配置进行构建。
  3. -destination 'generic/platform=iOS':这是一种架构类型。
  4. -archivePath:它使用给定名称将档案保存到此文件夹路径中。
  5. SKIP_INSTALL:设置NO将框架安装到文档中。
  6. BUILD_LIBRARIES_FOR_DISTRIBUTION:确保为分发而建造库并创建接口文件。

通过制作命令添加到您的终端来记录:

xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination通用/平台=iOS 引导' \
-archivePath './build/CalendarControl.framework-iphonesimulator.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

这些命令选项与 iOS 的命令选项相同,但有以下区别:

  1. -destination 'generic/platform=iOS Simulator':这是你设置架构类型的地方。
  2. -archivePath:这文档生成到带有给定名称的文件夹路径中。

最后,为macOS生成一个新文档。在终端中添加以下命令:

xcodebuild 文档\
-方案日历控制\
-配置发布\
-destination '平台=macOS,arch=x86_64,variant=Mac Catalyst' \
-archivePath './build/CalendarControl.framework-catalyst.xcarchive' \
跳过安装=否\
BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

此命令与其他命令相同,但有以下不同:

  1. -destination 'platform=macOS,arch=x86_64,variant=Mac Catalyst':这是您指示架构类型的地方。
  2. -archivePath:这文档生成到带有给定名称的文件夹路径中。

正如您在取景器和以下屏幕截图中所见,您从框架中生成了三个不同的归档文件。

生成 XCFramework

现在,制作框架。将下面的框架添加到终端上。

xcodebuild-创建-xcframework \
-framework './build/CalendarControl.framework-iphonesimulator.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-framework './build/CalendarControl.framework-iphoneos.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-framework './build/CalendarControl.framework-catalyst.xcarchive/Products/Library/Frameworks/CalendarControl.framework' \
-输出'./build/CalendarControl.xcframework'

您在使用命令之前生成的文件将 XCFramework 添加到制造的文件夹中。

检查制作文件夹的内容以查看 XCFramework 包含的内容。

呜呜!您现在已经制作了第一个 XCFramework。

将 XCFramework 集成到您的项目中

是时候从RWCalendarPicker项目中删除CalendarControl引用了,如下所示:

您的源代码是您不再需要访问框架的源代码。将XC拖到项目目标的Frameworks、Libraries和Embedded Content部分:

您将可以与以前相同的类,但这次的框架只是简单的访问。

将 XCFramework 作为 Swift 包分发

在 WWDC220,Apple 宣布您可以轻松地在 Swift 包中分发您的 XCFramework。那不是很了不起吗?

注意:如果您不是Swift PackagesSwift Package Manager,您可以通过阅读Swift Package Manager for iOS了解更多信息。

你应该有一个 Swift 包来分发你的 XCFramework。你将在下一节中创建一个。然后你可以通过在 GitHub 上发布来分享你喜欢的框架。

准备Swift包

在启动项目文件中,您已经有了一个 Swift 包。导航简单到/starter/3-SwiftPackage/CalendarControl并打开Package.swift

这个类是你的 Swift 包的清单。您需要进行修改以使CalendarControl成为 Swift 包。

按照以下步骤并使用正确的值填充清单:

  1. 平台:
平台:[
  .macOS(.v10_15) 、 .iOS(.v14) 、 .tvOS(.v14)
],

这个它的代码指示可以在哪个平台上运行。

  1. 产品:
产品: [
   。图书馆(
    名称:《日历控件》,
    目标:[“日历控件”]),
],

这些是软件包提供的产品。这些可以是——可以导入其他 Swift 项目的代码——也可以是可执行的——可以由操作系统运行的代码。产品是您可以导出以供其他包使用的目标。

  1. 目标:
目标:[
  .二进制目标(
    名称:“日历控件”,
    路径:“./Sources/CalendarControl.xcframework”)
]

目标是独立构建的代码模块。在这里为您的 XCFramework 添加路径。

注意:清单的第一行必须包含一个格式化的注释,告诉 Swift 包管理器构建包所需的 Swift 编译器的最低版本。

最后,将您的 XCFramework 添加到项目中并将其放在Sources下:

恭喜!您的 Swift 包已准备好分发。

大二进制和计算校验和

尽管情况并非如此CalendarControl,但一个特别庞大的框架将需要格外小心。如果您想了解有关处理较大二进制文件的更多信息,请打开下面的剧透。

揭示

发布你的 Swift 包

Xcode 使发布你的包变得容易。接下来,您将发布您创建的CalendarControl Swift 包。

使用 Xcode,打开Swift Package项目。然后从菜单栏中选择Source Control ▸ New Git Repositories...。

这会在您的计算机上创建一个 Git 存储库以及您的代码的初始提交。

在你可以发布你的包供其他人使用之前,它必须是公开的。最简单的方法是发布到GitHub

如果您没有 GitHub 帐户,您可以在github.com免费创建一个。然后,如果您还没有这样做,请通过在 Xcode 菜单中选择Xcode ▸ Preferences将您的 GitHub 帐户添加到 Xcode。选择帐户

现在,单击+添加一个新帐户。选择GitHub并按要求填写您的凭据。

打开源代码管理导航器并选择CalendarControl包。然后通过右键单击Control-click打开上下文菜单。

接下来,选择New “CalendarControl” Remote…。您可以将可见性更改为私人或接受默认设置。然后单击创建

这会在 GitHub 上创建一个新存储库,并自动为您推送代码。

接下来,通过为您的包创建标签来设置您的框架的版本。在上下文菜单中,选择标记主…。将其标记为版本1.0.0并单击Create

最后,从 Xcode 菜单栏中选择Source Control ▸ Push...。确保选择了包含标签。然后点击推送

这会将标签推送到 SwiftPM 可以读取的 GitHub。您的软件包的 1.0.0 版现已上线。:]

使用 Swift 包

现在是时候在RWCalendarPicker项目中使用 Swift 包了。

再次打开RWCalendarPicker。从项目目标中删除导入的CalendarControl框架:

接下来,您将学习如何使用Swift Package Manager将 Swift 包添加到项目中。

使用 SPM 添加包依赖项

选择File ▸ Swift Packages ▸ Add Package Dependency ...。粘贴 Git 存储库 URL。单击下一步

根据您的 GitHub 设置,您可能需要在此处验证您的 SSH 密钥。然后,在Rules下,确保为1.0.0版本选择了Up to Next Major。单击下一步

如果您想了解有关主要和次要版本控制的更多信息,请查看semver.org。在 Xcode 获取包后,确保选择CalendarControl产品并将其添加到RWCalendarPicker目标。然后选择完成

构建并运行。确保一切都像以前一样运行。

极好的!现在你有了一个在项目中使用的远程 Swift 包。

结论

本教程的最终项目资料下载地址

链接:https://pan.baidu.com/s/1vIg0rxlw11UoaKqBbLzadQ

提取码:adiz

在本教程中,您学习了如何:

  1. RWCalendarPicker 中提取CalendarControl并制作一个新框架。
  2. 使用*RWCalendarPicker中的*CalendarControl框架。
  3. 构建一个二进制框架并在 RWCalendarPicker 中使用该XCFramework
  4. 发布一个 Swift 包并在RWCalendarPicker中使用它。

这里也推荐一些面试相关的内容!

  • ① BAT等各个大厂iOS面试真题+答案大全

  • ② iOS中高级开发必看的热门书籍(经典必看)

  • ③ iOS开发高级面试"简历制作"指导

  • ④ iOS面试流程到基础知识大全


推荐阅读
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了Vue2.5开发去哪儿网App从零基础入门到实战项目相关的知识,希望对你有一定的参考价值。第1章课程介绍本章 ... [详细]
  • C# WPF自定义按钮的方法
    本文介绍了在C# WPF中实现自定义按钮的方法,包括使用图片作为按钮背景、自定义鼠标进入效果、自定义按压效果和自定义禁用效果。通过创建CustomButton.cs类和ButtonStyles.xaml资源文件,设计按钮的Style并添加所需的依赖属性,可以实现自定义按钮的效果。示例代码在ButtonStyles.xaml中给出。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • Vagrant虚拟化工具的安装和使用教程
    本文介绍了Vagrant虚拟化工具的安装和使用教程。首先介绍了安装virtualBox和Vagrant的步骤。然后详细说明了Vagrant的安装和使用方法,包括如何检查安装是否成功。最后介绍了下载虚拟机镜像的步骤,以及Vagrant镜像网站的相关信息。 ... [详细]
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 本文介绍了解决mysql 5.1启动问题的方法,通过修改my.ini文件中的相关配置,包括innodb_data_home_dir和skip-innodb等,可以解决启动问题。同时还介绍了如何调整内存池来存储metadata信息。 ... [详细]
  • Spring框架《一》简介
    Spring框架《一》1.Spring概述1.1简介1.2Spring模板二、IOC容器和Bean1.IOC和DI简介2.三种通过类型获取bean3.给bean的属性赋值3.1依赖 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
  • 本文讨论了在ASP中创建RazorFunctions.cshtml文件时出现的问题,即ASP.global_asax不存在于命名空间ASP中。文章提供了解决该问题的代码示例,并详细解释了代码中涉及的关键概念,如HttpContext、Request和RouteData等。通过阅读本文,读者可以了解如何解决该问题并理解相关的ASP概念。 ... [详细]
  • Jboss的EJB部署描述符standardjaws.xml配置步骤详解
    本文详细介绍了Jboss的EJB部署描述符standardjaws.xml的配置步骤,包括映射CMP实体EJB、数据源连接池的获取以及数据库配置等内容。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 本文实例讲述了Android编程实现读取工程中的txt文件功能。分享给大家供大家参考,具体如下:1.众所周知,Android的res文件夹 ... [详细]
  • setMeasuredDimension(x,y);导致出错-------------布局文件没设置背景颜色导致onMeasure()测量-----如果不执行setMeasu ... [详细]
author-avatar
苦咖啡青柠檬
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有