使用Swift框架重复使用代码

当您发现错误并且必须使用它修复所有应用程序时,复制和粘贴代码会很糟糕。但有没有办法避免呢?
就在这里! Apple提供了一种称为框架的工具来简化代码共享。此外,它还为我们提供了一种机制,可以对相关代码进行分组(模块化)并限制对代码的访问(封装)。
在本文中,我们将介绍框架是什么以及使用它们的原因。我将按照一步一步的指导如何创建和构建框架,最后如何在应用程序中使用框架。框架中的代码将专门用于本文的Swift编写。

什么是框架

框架是一个结构化目录,可以包含共享代码和共享资源,如图像,nib文件(xib和故事板的编译形式)和其他资产。您可以将其视为提供代码和/或其他可重用资产的包,以使您的代码正常工作。

为什么使用框架

我们已经介绍了使用框架的主要原因。另一个很好的理由是简化与组织服务的集成。
例如,Paypal提供框架来帮助应用程序处理信用卡交易。 Onfido提供了进行远程身份验证的框架。
框架可以节省您的客户与您的服务的集成工作。为客户节省时间和金钱。更快的客户可以在您开始赚钱之前消费您的服务。
此外,在选择提供者时,时间和精力可能是前景的关键因素。事实上,价值超过92亿美元的Stripe开始出于对支付处理器的整合挫败感。

如何构建一个框架

在本节中,我们将指导您完成创建和构建框架的过程。该框架将包含一个简单的登录屏幕。
在接下来的步骤中,我们将:

  1. 使用Cocoa Touch Framework模板创建项目
  2. 使用Xib添加一个视图控制器
  3. 将视图插入我们的视图控制器以允许用户登录
  4. 将Xib中的视图连接到LoginViewController类
  5. 以编程方式加载视图控制器
  6. 访问框架外的视图控制器
    如果您已经熟悉这些,请随意跳过任何部分或全部。

1. 创建项目

让我们首先在菜单栏中选择File> New> Project ...,在Xcode中创建一个框架。

创建一个新项目

继续选择iOS Cocoa Touch Framework项目模板,然后单击“下一步”。
选择Cocoa Touch Framework模板

最后命名你的框架,你可以随心所欲地命名它。我的名字是MyFramework。还要确保所选语言为Swift。命名后,单击“下一步”并选择要存储项目的位置,最后单击“创建”。
命名框架,例如MyFramework

您现在应该有一个带有空框架的项目。让我们继续并为我们的项目添加一个可供多个应用程序使用的屏幕。

2. 添加视图控制器

让我们继续添加一个空的XIB文件,我们将使用界面构建器设计我们的登录屏幕。从菜单栏中选择File> New> File ...,然后选择Cocoa Touch Class。


从Cocoa Touch Class模板创建一个新文件

将您的类命名为LoginViewController,作为UIViewController的子类。选中“创建XIB文件”选项。从语言下拉菜单中选择Swift。
将您的类命名为LoginViewController,作为UIViewController的子类。选中“创建XIB文件”选项。从语言下拉菜单中选择Swift。

使用Cocoa Touch Class模板,Xcode将添加一个XIB和一个Swift文件,其中包含我们指定的名称。它将为我们创建从XIB到视图控制器的必要链接。

3. 向我们的视图控制器中添加视图

此时我们的LoginViewController XIB将完全为空。让我们为电子邮件和密码添加标签和文本字段,以允许用户进行身份验证。

单击对象库。出现搜索栏时,搜索标签,然后将标签拖放到空白画布上。


将标签视图拖放到空白画布上

对UITextField重复这三个步骤。
将TextField拖放到画布上

根据需要对齐视图,然后复制并粘贴它们,这样您就有两个标签和两个文本字段,一个用于电子邮件,另一个用于密码。使用有意义的文本编辑标签,例如电子邮件和密码。最后添加一个按钮,允许用户执行签名操作。
复制并粘贴标签和文本字段,重命名标签并添加登录按钮

此时,我们拥有了让用户登录所需的一切。不要过多担心视图的布局和外观,这超出了本文的范围。

4. 将视图连接到视图控制器

在这一步中,我们只需要创建一个从XIB中的电子邮件和密码文本字段视图到我们的视图控制器的链接,以从中获取文本。此外,我们还希望将登录按钮上的点击操作连接到我们将在其中进行登录的视图控制器上的功能。

首先打开LoginViewController.xib,然后打开助手编辑器,它是Xcode UI右上角的两个相交循环图标。
然后逐个选择文本字段并按住Control键并将视图拖放到视图控制器上。这将打开一个弹出窗口,允许我们配置XIB和视图控制器之间的连接。现在将文本字段的连接设置为Outlet,将名称设置为与每个文本字段相关的内容,例如emailTextField,类型为UITextField,以及从最后一个选择弱选项。重复密码文本字段的步骤。
现在拖放登录按钮,但在这种情况下,选择Action for connection,将其命名为signIn,然后从类型下拉列表下方的下拉列表中选择Touch Up Inside。这有点不同,我们正在对视图而不是视图本身进行操作,在此我们指定一个函数来响应登录按钮上的点击。

现在我们将打印用户名和密码到控制台。在登录功能中添加以下行:
print("username \(emailTextField.text) password \(passwordTextField.text)")
我们现在拥有了让用户登录所需的一切。我们不会在这里介绍身份验证,代码是演示访问框架代码和资源的应用程序。我们将以编程方式加载视图控制器,但在我们完成之前,我们的视图控制器必须知道要加载哪个XIB。

5. 以编程方式加载视图控制器

我们的XIB包含我们的视图声明以及它们的结构,配置和链接方式。 XIB有一个关于谁与之链接以及如何链接的概念,但是我们的视图控制器不知道我们的XIB,因此当我们实例化视图控制器时,就像现在一样,我们的视图控制器上的视图和链接将不会被创建。我们必须告诉我们的视图控制器在实例化时从哪里读取它的视图。为我们的视图控制器添加以下自定义初始化函数,该函数从我们的xib读取:

    super.init(nibName: "LoginViewController", bundle: Bundle(for: LoginViewController.self))
}
required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

我们将调用init()函数来实现我们的视图控制器。 UIViewController已经包含一个init函数,它允许我们指定要读取的XIB(文件名)以及在哪里找到这个XIB文件; init(nibName:,bundle:)。对于XIB位置,我们指定它将位于同一个包asLoginViewController类中。
我们忽略所需的init?因为我们不会使用它,但是当我们想要一个自定义初始化程序时,我们不得不在我们的视图控制器中指定它。
到目前为止,我们应该能够以编程方式加载视图控制器,但仅限于框架内的代码。我们想从使用框架的应用程序初始化我们的视图控制器。

6. 访问框架外的视图控制器

Swift具有访问控制,限制代码的哪些部分可以从其他代码访问。当我们没有为我们的函数和变量指定任何访问控制时,Swift将这些访问控制默认为内部访问,这样init()等同于内部init()。在这种情况下,我们框架中包含的所有代码都可以访问init函数,但不能访问外部。为了允许从我们的框架外部访问我们的代码,我们必须在我们的init函数前面加上公共访问控制声明,这样我们的init函数应该如下所示:

    super.init(nibName: "LoginViewController", bundle: Bundle(for: LoginViewController.self))
}

但这并不是让我们的init函数公开可用所需的全部内容。我们的init函数存在于一个类中,该类也没有指定访问控制,因此是内部的。如果我们的课程无法访问,那么我们的公共init方法将存在于其中。为了弥补这一点,我们还必须将公共访问控制添加到我们的类中。您可能必须在关键字覆盖之后向任何函数添加public,但是
public class LoginViewController: UIViewController { ... }
现在我们可以从使用框架的应用程序初始化我们的视图控制器。

这就是我们需要做的就是展示如何以标准化框架格式向其他开发人员共享代码和资源。

使用框架

在本节中,我们将通过我们现在将创建的应用程序来使用我们在上一节中构建的框架。如果您跳过上一节,可以在此处找到框架项目源代码。
我们将:

  1. 使用iOS应用目标创建新项目
  2. 添加登录按钮到我们的视图控制器
  3. 在按钮点击上显示框架登录屏幕

1. 创建一个新项目

让我们为我们的框架消费者应用程序创建一个新项目。从菜单栏中选择File> New> Project ....
在iOS选项卡下搜索并选择Single View App,然后单击Next。

将MyApp作为我们的项目名称。选择Swift作为语言。点击下一步。
单例应用的项目选项

当提示保存新项目的位置时,为方便起见,将其保存在框架项目的同一目录下。

2. 添加一个登陆按钮

让我们在我们的视图控制器上添加按钮,该控制器是作为Single View App模板的一部分自动创建的。打开Main.storyboard并将按钮拖放到空白画布上。就像我们在框架项目前面的登录按钮所做的那样,打开助手编辑器并将按钮从故事板拖放到ViewController类上。将连接类型配置为Action,将其命名为login,并从类型下拉列表下方的下拉列表中选择Touch Up Inside。您应该在ViewController类中具有以下空函数:

}

在登录功能中,我们希望从框架中显示登录屏幕。

3. 在按钮点击时展示框架中的登陆屏幕

此时我们已经创建了一个新项目,为自动创建的视图控制器添加了一个按钮,并将按钮点击连接到ViewController类中的一个函数。我们希望在用户点击登录按钮时从我们之前创建的框架中显示登录屏幕。但在我们做到这一点之前,我们首先必须将框架链接到我们的应用程序。我们可以通过各种方式访问​​框架,但在本文中,我们将使用Xcode工作区来执行此操作。在工作区中,您可以添加多个项目并将它们链接在一起,就像在单个项目下一样。
要创建工作区,请选择“文件”>“新建”>“工作区...”,并将其命名为MyApp。将其保存在与应用程序和框架项目相同的目录中。
工作区最初将为空,因此我们将两个项目添加到工作区。从菜单栏中选择File> Add Files to“MyApp”...并添加分别位于名为MyApp和MyFramework的目录下的MyApp.xcodeproj和MyFramework.xcodeproj。确保其他XCode窗口中没有打开这些项目,否则它们不会显示其内容。
接下来选择MyApp项目文件(项目导航器中的蓝色文档图标,位于右侧窗格的第一个选项卡下)。然后在“常规”选项卡下的“项目设置”窗口中,在“嵌入式​​二进制文件”部分下单击+按钮。将出现一个新窗口,其中包含工作区中的所有选项。选择MyFramework.framework,然后单击“添加”。

向你的app中添加框架

现在我们已经添加了框架,当用户点击登录按钮时,应用程序会显示登录屏幕。打开ViewController.swift并在导入UIKit下添加导入MyFramework,这将允许我们从我们的文件中访问框架代码。接下来,将以下代码行添加到ViewController类中的login函数:
present(LoginViewController(), animated: true, completion: nil)
当用户点击应用程序中的登录按钮时,此行将显示框架中的登录屏幕。

就这样!现在您可以运行该应用程序并自行查看它!

总结

到现在为止你应该知道:

  • 什么是框架
  • 为什么你应该使用它们
  • 如何构建和使用它们

下一步

使用Xcode工作区使用框架很难。是否有更简单的方法来使用框架?

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容