使用 Swift 2 进行 iOS 开发 - 快速指南


使用 Swift 2 进行 iOS 开发 - Xcode IDE

要开发 iOS 应用程序,您需要有一台 Apple 设备,如 MacBook Pro、Mac Mini 或任何带有 OS X 操作系统的 Apple 设备,以及以下设备 -

  • Xcode - 可以从https://developer.apple.com/downloads/下载您需要一个免费的 Apple 开发者帐户。

  • 模拟器- 这是您的虚拟 iPhone/iPad(iOS 设备),安装在您的计算机上,因此您无需单独安装。

关于Xcode

Xcode是苹果公司为iOS/OS X应用程序开发提供的默认IDE(集成开发环境)。它是一个 IDE,包含开发 iOS、OS X、Watch OS、TV OS 应用程序等所需的一切。

要运行 Xcode,您必须有 -

  • 运行 OS X(即 Apple 的官方操作系统)的 Mac 设备。
  • Apple ID(免费):下载 IDE。

安装

要在您的设备中安装 Xcode,请按照以下步骤操作。如果您已经安装,请跳过。

  • 转到 App Store,如果尚未登录,请搜索 Xcode。单击获取并安装。

  • 下载后,转到应用程序或启动板并运行您的应用程序。

  • 在第一次运行时,它可能会要求一些额外的下载,让它下载所有内容,如果需要,请输入密码。

  • 完成所有这些后,欢迎屏幕将出现,如下所示。

Xcode

iOS 开发 Swift 2 - 第一个应用程序

在本教程中,我们将学习 iOS 开发的一些基本概念,其中包括 -

  • 制作一个新项目
  • 我们的 IDE 的特点
  • 在 IDE 中导航
  • 向视图添加标签
  • 运行应用程序
  • 根据您的舒适度调整模拟器

如果您是初学者,那么本教程将对您有很大帮助。

创建一个新的 Xcode 项目

要创建一个新的 Xcode 项目,我们应该按照下面给出的步骤操作。

步骤 1 - 单击 Launchpad 中的 Xcode 图标,然后选择“创建新的 Xcode 项目”

新项目

步骤 2 - 选择 iOS,然后选择单视图应用程序,单击下一步。

单视图

步骤 3 - 随后出现的屏幕将有几个字段需要填写。以下几点解释了如何填写每个字段。

  • 输入项目名称 - 它可以是与您的项目类似的名称。

  • 团队字段现在可以留空。当我们在团队中申请时会用到它。

  • 组织名称是您的组织的名称,或者如果它是您的个人项目,您可以将其命名为任何名称。除非您想在应用程序商店上发布您的应用程序,否则这并不重要。

  • 标识符通常是您的应用程序的唯一标识符,不得与应用程序商店中的任何其他应用程序匹配(仅当您选择在应用程序商店上传应用程序时)。

  • 语言将是 Swift,设备将是通用的,所有其他选项目前都将取消选中。

填写完所有详细信息后,单击“下一步”按钮。

下一个按钮

步骤 4 - 选择要存储项目的位置。暂时取消选中“创建 Git 存储库”复选框,因为我们现在不需要它。单击“创建”。

恭喜!您的项目已创建。

通过 Xcode 环境导航

单击导航器面板内的Main.storyboard选项。这将打开主视图,该视图将在应用程序运行时出现。

面板

添加标签

屏幕右下角有一个搜索栏。在该搜索栏中输入标签,然后按回车键。

  • 搜索标签后,将标签拖放到主视图中。双击标签文本并输入“Hello World”。

  • 将标签拖到视图的中心,当标签正好位于中心时,会出现两条在中心相交的线。

现在您的视图应如以下屏幕截图所示。

添加标签

运行应用程序

选择您的设备,单击右上角的播放按钮。

你好世界

这是我们的最终应用程序,在 iPhone 7 模拟器上运行。

最终申请

调整模拟器属性

当我们第一次运行应用程序时,模拟器的屏幕可能不适合您的台式机或笔记本电脑屏幕。因此,当您的模拟器在前台运行时,单击“窗口”→“缩放”,然后选择适合您的显示的模拟器屏幕大小百分比。

窗秤

我们将在本教程中使用模拟器功能时继续讨论它们。

干得好,这是第一个申请,您已成功完成。干杯!

使应用程序具有交互性

在本章中,我们将介绍 iOS 为与用户交互提供的一些新事物和 UI 功能。我们将添加 -

  • 文本字段
  • 标签
  • 按钮及其操作

此外,我们将用 swift 编写动态标签的代码,它将显示用户输入的输入的计算结果。

标题“使我们的应用程序具有交互性”是指使我们的应用程序与用户交互。因此,在这里我们赋予用户交互和控制应用程序的能力。

添加文本字段

在这里,我们将再次制作一个新项目。它应该易于管理,因为我们已经讨论了如何在 Xcode 中创建新项目。

好的,我们现在将创建一个名为“My Dog's Age”的新项目。创建该项目后,我们将单击“Main.storyboard”文件并按照下面给出的步骤操作。

  • 在实用程序窗格的搜索栏(位于 Xcode 右下角)中,搜索 Label。单击该标签并将其拖动到 main.storyboard /(视图)。然后,双击标签并将其重命名为 - “My Dog's Age”。

  • 搜索“文本字段”,单击该文本字段并将其拖到您的视图中。选择此文本字段后,转到属性检查器并将键盘类型更改为数字键盘,以便只能输入数字,如下图所示。

数字键盘

添加按钮到我们的视图

现在在搜索栏中搜索按钮。将其拖到您的视图中,双击它并将其重命名为“计算”。

添加标签到视图

搜索标签并将其添加到按钮下方,以显示年龄输出。双击并将标签清空并稍微拉伸,以便可以看到完整的输出。

提示- 如果您无法通过双击重命名,则选择该项目,然后在实用程序窗格中 -属性检查器,有该项目的标题,修改该项目并按回车键,如下面的屏幕截图所示。

计算

现在,您的 Main.storyboard 应如下所示。

主要故事板

我们不会就此停止,现在我们将讨论如何将图像添加到 main.storyboard。

将图像添加到我们的视图中

首先,我们应该首先搜索要添加到项目中的图像。您可以下载下面给出的图像 -

下载图片

将此图像复制到您的项目中,或将此图像拖到您的项目中,然后您将看到以下窗口。

选择选项

确保选择、复制项目(如果需要)并创建组。单击“完成”按钮。

现在,转到“实用程序窗格”→“对象库”并搜索“图像视图”。将图像视图拖到您的视图中。现在您的视图应如下面给出的屏幕截图所示。

终极视野

现在,单击此图像视图,您刚刚将其拖入视图中,然后您将看到在实用程序区域中有一个名为“图像”的选项来选择图像。单击该箭头,您将看到所有可用的图像。确保您已选择这个新添加的图像视图。

图像视图

现在您已经为图像视图选择了图像,您的最终视图应如下所示。对于这个应用程序,这是我们将使用 main.storyboard 做的唯一事情。

这是添加所有 UI 元素后的视图。

用户界面元素

之后,我们就得到了代码的逻辑实现,如果您已经完成了这一步,我们将继续该实现。

现在,选择视图控制器并通过单击右上角的助理编辑器按钮打开助理编辑器(如下面的屏幕截图所示)。

助理编辑按钮

现在,我们的视图应如下所示。

查看.jpg

向我们的应用程序添加功能

到目前为止,我们的应用程序只是一个静态应用程序,它不会响应任何内容,也不会因用户交互而发生变化。

现在是将 UI 元素连接到代码的主要部分,UI 将根据用户输入进行更改。“ViewController.swift”文件是我们的主文件,我们将在其中为当前视图编写代码。

注意- 目前我们正在使用单个视图,稍后我们将讨论多个视图。我们将讨论不同的文件如何控制不同的视图。

单击文本字段,按下 Control 并将光标拖动到屏幕的第二部分,即 viewcontroller.swift 文件。您将看到一条蓝线连接我们的视图和 swift 文件。当您释放鼠标时,您将看到一个弹出窗口,要求输入。

进入年龄

提示- 使用与您的输入字段类似的任何名称填充“名称”字段。一个重要的一点是,名称不能有空格,因此您可以像上图所示那样编写它,即如果名称有多个单词,则第一个单词应小写,然后是每个下一个单词的第一个字母单词将成为大写。

按照相同的步骤连接其余的元件。请记住,对于文本字段和标签,类型为 Outlet。但是,在添加按钮时,类型必须是操作,如下图所示。

计算按下

在这个阶段,我们的 viewcontroller.swift 看起来像 -

视图控制器Swift

现在,在按钮操作中添加以下行 -

var age = Int(enteredAge.text!)! * 8 
yearsLabel.text = String(age);

提示-在 swift 中,我们不需要添加分号来结束一行,但即使我们添加分号,编译器也不会报告任何错误

在上面的代码中,第一行声明了一个变量“age”,我们将在下一章中讨论它。然后我们分配用户输入的值,将其转换为整数,然后乘以 8。

在第二行中,我们将“age”的值分配给输出标签。在此阶段,我们的视图控制器将如下所示 -

分配年龄值

现在,我们将运行我们的应用程序,这就是它的显示方式。

运行应用程序

提示-如果您的键盘在第一次运行时没有出现,请打开模拟器,单击硬件,转到键盘,然后单击切换软件键盘。

在下一章中,我们将讨论一个名为Playground的新工具。我们还将学习一些更快速的概念,如变量、字典、数组循环、类和对象。

使用 Swift 2 进行 iOS 开发 - Playground

在本章中,我们将介绍一个可以编写和执行 swift 代码的新环境。我们还将介绍 Swift Playground 的以下方面 -

  • 变量
  • 词典
  • 数组
  • 循环
  • 类和对象

注意- 我们只会浏览这些基本概念,我们将在本教程中使用这些概念,如果您想深入学习 swift,您可以查看我们的Swift 教程

Playground 是 Xcode 提供的一个用于执行 swift 代码的工具。我们将从创建一个新的游乐场开始。

启动 Swift Playground

要创建 Swift Playground,请单击 Xcode 图标,然后选择第一个选项,开始使用 Swift Playground。

从付款开始

为您的 Playground 命名并选择 iOS 作为平台。让我们将我们的游乐场命名为演示游乐场。单击“下一步”。

名称平台

这些是制作游乐场所需遵循的唯一步骤。以下屏幕截图显示了游乐场。

演示游乐场

先生编号 基本概念和描述
1 变量

变量是我们的程序可以用来存储和操作数据的内存/存储。每个变量都有特定的数据类型,它决定变量在内存中占用的大小。

2 词典

字典是以键值对的形式存储值的集合,即存储在字典中的数据以每个值与一个键相关的方法存储。在这里,每个键都是唯一的,不能在同一字典中出现两次。

3 数组

数组是在有序列表中存储相同类型数据的数据类型。相同的值可以出现在数组中的多个索引/位置处。

4 循环(控制流)

Swift 提供了多种控制流语句。循环通常用于多次迭代条件或语句,直到满足该循环的条件/程序员的需求。

5 类和对象

类是通用的灵活结构,是程序代码的构建块。

对象是通常用来指代类的实例的术语,因此我们可以将其称为实例而不是对象。

使用 Swift 制作应用程序

在本章中,我们将使用 Swift 创建两个新应用程序。

第一个应用——“猜数字”

在本节中,我们将创建一个名为“猜数字”的应用程序。要制作此应用程序,请创建一个新的 iOS 单视图应用程序并将其命名为您想要的任何名称。

单击 main.storyboard选择您的主视图。

  • 添加文本标签 → 将文本更改为“猜数字”。更改颜色、尺寸属性并根据您的要求进行制作。

  • 添加输入字段,拉伸至完整视图。

  • 添加一个按钮并将其命名为“猜测”。

  • 再添加一个标签,拉伸它,然后清除文本框。

这就是添加所有元素后视图的样子。

猜数字

现在切换到助理编辑器并单击 UI 元素中的拖动以查看控制器文件,然后将文本字段连接为出口并将其命名为 userInput。相似地,

  • 连接空标签作为outlet,并将其命名为resultLabel。
  • 将“猜测”按钮连接为操作并将其命名为“guessButtonPressed”。

逻辑是什么?

逻辑很简单,我们将生成 0-9 之间的随机数,看看它是否等于用户输入的数字。如果相等,我们将显示“你是对的”,否则我们将显示“你错了!”。

应用逻辑

要生成 0-9 之间的随机数,我们将使用以下命令。

let rollIt = String(arc4random_uniform(10))

然后我们将使用以下逻辑来检查它是否与用户输入相同。

if userInput.text == rollIt { 
   resultLabel.text = "You're right!" 
} else { 
   resultLabel.text = "Wrong! It was a " + rollIt + "." 
}

这就是按钮操作函数中的最终逻辑的样子。

@IBAction func guessButtonPressed(_ sender: Any) { 
   let rollIt = String(arc4random_uniform(10))  
   if userInput.text == rollIt { 
      resultLabel.text = "You're right!" 
   } else { 
      resultLabel.text = "Wrong! It was a " + rollIt + "." 
   } 
} 

您的最终应用程序现在应该如下所示。

应用逻辑

现在让我们运行我们的应用程序并检查其输出。打开屏幕应如下所示 -

输出

接下来,在输入区域输入一个数字。

输入

让我们输入另一个数字并检查其输出 -

输入另一个号码

我们又完成了一份申请。尝试运行该应用程序,并输入不同的输入。

第二个应用程序——“Is It Prime”

在此应用程序中,我们将从用户处获取输入,然后检查该数字是否为素数 -

  • 布局- 与之前的应用程序类似,我们需要一个输入、一个按钮和一个输出标签。

  • 挑战- 创建 UI 并将元素连接到代码。另外,尝试一下您是否可以自己创建完整的项目。如果您成功地自己创建了它,那就太棒了,并且您在 iOS 开发方面做得非常出色。

如果您无法管理,请不要担心。请看下图并尝试做同样的事情。

是总理吗

尝试创建一个这样的视图,如果您还无法做到这一点,请阅读上一节我们开发了一个猜猜游戏。

逻辑是什么?

素数是指不能被除 1 和该数字本身之外的任何其他数字整除的数字。

示例- 7 是素数,因为除 1 和 7 之外的任何其他数字都不能整除它。

如何实施?

尝试编写一个检查素数的代码。然后获取用户输入并查看它是否是素数。如果是,则显示素数;否则在结果标签中显示不是素数。

这是检查提供的数字是否为“质数”的代码 -

@IBAction func isItPrimeButtonPressed(_ sender: Any) { 
   if let userEnteredString = userInput.text { 
      let userEnteredInteger = Int(userEnteredString) 
      if let number = userEnteredInteger { 
         var isPrime = true 
         if number == 1 { 
            isPrime = false 
         } 
         var i = 2 
         while i < number { 
            if number % i == 0 { 
               isPrime = false 
            } 
            i += 1 
         } 
         
         if isPrime { 
            resultLabel.text = "yes. \(number) is prime!" 
         } else { 
            resultLabel.text = "No. \(number) is not prime" 
         } 
      } else { 
         resultLabel.text = "Please enter a positive whole number"                 
      } 
   } 
} 

这就是您的按钮操作的样子。以下是最终代码和视图的图像 -

最终代码

如果您遵循该过程,那么您正在运行的应用程序应该是这样的。

运行应用程序

现在,让我们通过提供输入值来测试我们的应用程序 -

测试应用

使用 Swift2 进行 iOS 开发 - 高级 iOS

在本章中,我们将介绍一些高级功能,例如在应用程序上创建多个视图、添加导航栏、添加表视图、在应用程序中存储数据、制作 Web 应用程序等。

请仔细阅读每一节,因为本章包含了我们开发应用程序时需要的大部分内容。

多视图控制器

在我们之前的应用程序中,我们只给出了单个视图/视图控制器。但是,我们的应用程序中可以有多个视图,并且可以独立地对其中任何一个执行操作。

因此,我们将从创建一个新项目开始;这个项目的名字有多种说法。与其他所有项目一样,该项目也有一个视图控制器和该控制器的 Swift 文件。(您可以通过选择视图并在身份检查器中查看其属性来看到这一点。)

以下屏幕截图显示了我们当前视图的样子 -

入口点

在右侧(身份检查器),我们可以看到与视图控制器相关的类。左侧的这个箭头是入口点。这是应用程序开始运行后显示的第一个视图。

添加第二个多视图控制器

要将其他视图控制器添加到我们的应用程序中,我们将在对象库中搜索视图控制器。一旦找到它,我们将把视图控制器拖到我们的 main.storyboard 上,就在任何其他视图之外。

第二个多视图控制器

这就是您的应用程序应该的样子。现在,我们已经添加了一个视图控制器,但现在我们还需要为新添加的视图创建一个视图控制器类。

右键单击您的项目→新建文件→cocoa Touch Class→将其命名为您想要的任何名称,我们将其命名为“SecondViewController”。

这就是为视图控制器创建类文件的方法。现在,返回“main.storyboard”,单击第二个视图控制器并查看其身份检查器。

班级字段现在必须为空,因此单击该字段并开始输入您在上一步中添加的班级名称。如果出现,请单击输入。

第二个视图控制器

我们现在已经创建了一个多视图控制器并为该视图添加了控制器类文件。但是,如果您运行该应用程序,它仍然不会显示您的第二个视图。为什么?

因为我们还没有添加一个函数,它将把我们带到那个视图。简而言之,我们尚未将导航添加到我们的应用程序中。不用担心; 我们将在下一节中介绍它。

向应用程序添加导航

从一个视图转换到另一个视图的过程称为Segueing,即通过在两个视图之间创建 Segue 来完成。为此,请在第一个视图控制器中添加一个按钮,然后控制从该按钮拖动到第二个视图。当您释放按钮时,您将看到一些选项,如下面的屏幕截图所示。

向应用程序添加导航

从“操作片段”中选择“显示”选项。现在运行您的应用程序,您将看到单击按钮后,会出现第二个视图(为了更清楚地在第二个视图中添加一些内容,以便您可以识别)。

但是,现在您无法返回到第一个视图。为此,我们有导航控制器

添加导航控制器

选择您的第一个视图控制器,然后在顶部栏中单击编辑器 → 嵌入 → 导航控制器

编辑

现在,我们的应用程序应如下图所示。

截屏

我们应该注意,视图顶部有一个浅灰色的小行。现在,当我们运行应用程序时,我们可以看到视图顶部有一个导航栏。当我们单击该按钮时,我们将进入第二个视图,在该视图中我们将在导航栏中看到后退按钮。单击此按钮,我们将返回到初始视图。

将标题和后退按钮添加到导航栏

要向导航栏添加标题,请单击导航栏,然后查看其属性检查器。在那里我们会看到 -

标题后退按钮
  • 标题- 这将是导航栏的标题,出现在中心。

  • 提示- 它出现在标题栏顶部的中央。

  • 返回按钮- 在这里您可以修改显示在返回按钮中的文本。

目前,传递视图的按钮位于我们的视图上,如果我们希望屏幕上显示其他内容,这可能不适合。因此,我们将在导航栏中添加一个 Bar Button 项,这将带我们进入第二个视图。然而,为此我们应该首先删除我们添加的最后一个按钮。

添加栏按钮项目

在对象库中搜索栏按钮项目并将其拖放到导航栏的右侧。将其命名为 - “Next >”,将控件从其拖动到第二个视图,选择“显示”,就像我们对添加的最后一个按钮所做的那样。

添加栏按钮

现在运行该应用程序,它看起来会更干净、更好。这就是我们现在对导航要做的全部事情。在后续章节中,我们将根据需要使用 Swift 代码修改导航栏。

表格视图

表将数据显示为包含多行的单列列表,这些行可以进一步分为多个部分。表格应该用于以干净、有效的方式呈现数据。

在本节中,我们将了解如何添加表视图、添加原型单元格、为表视图添加数据源和委托、更改表的属性以及为表视图单元格设置动态数据。

添加表视图

要添加表格视图,我们首先创建一个新项目并将其命名为“tableView”。然后,进入对象库并搜索Table View,我们将看到表视图、表视图控制器和许多其他选项。但是,我们应该选择表视图,将其拖动并添加到默认视图控制器中。

表格视图

添加原型单元

拉伸表视图,使其覆盖整个视图,同时表视图会突出显示。检查它的属性检查器,有一个名为 Prototype cells 的字段,当前为 0。我们应该将其值更改为 1,现在您的视图应如下所示 -

原型细胞

更改单元格标识符

现在,在您的视图中,单击原型单元(这有点棘手)。因此,在文档大纲中,单击“视图控制器”→“视图”→“表格视图”→“表格视图单元格”,现在在其属性检查器中有一列名为“标识符”的列,单击该列并将其命名为“单元格”。请参阅以下屏幕截图以了解上述步骤。

表格视图单元格

添加委托和数据源

为了使我们的表视图动态化,我们需要它们加载动态数据。因此,我们需要一个委托和一个数据源。要创建表的委托和数据源,请控制从表视图拖动到视图控制器或视图控制器顶部的黄色按钮,如下面的屏幕截图所示。

委托数据源

当我们松开光标时,我们会看到两个选项,dataSource和delegate,一一选择它们(当您选择任何一个选项时,弹出窗口将隐藏,您需要重复上述步骤来添加第二个选项) 。现在它应该看起来像 -

奥特莱斯

这就是我们现在要对 UI / Main.Storyboard 所做的一切。现在切换到“ViewController.swift”文件。将UITableViewDelegate、UITableViewDataSource添加到您的 viewController.swift 中,如下所示 -

表视图委托视图数据源

但是,现在 Xcode 将在该行中显示错误。

Xcode 错误

这是因为有几个方法我们需要使用UITableView

要查看这些方法,请按住 Command 键并单击 UITableViewDataSouce,然后复制具有“numberOfRowsInSection”、“cellForRowAtIndex”参数的前两个方法,并将它们粘贴到 ViewController.swift 中的 viewDidLoad() 之前。

从这两个方法中删除这行@available(iOS 2.0, *) ,并添加左大括号和右大括号“{}”。现在,视图将如下所示 -

实用视图

Xcode 必须在这两个函数中显示错误。不过,不用担心,因为这是因为我们没有添加这些函数的返回类型。

numberOfRowsInSection - 此函数定义我们的部分将包含的行数。所以现在将此行添加到您的方法中。

return 1 //This will return only one row.

cellForRowAt - 此方法返回每个单元格的内容,indexPath包含每个单元格的索引。我们将创建一个单元格,然后为该单元格分配一些值,最后返回该单元格。

现在,您的函数应如下所示 -

internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
   return 1; 
} 
internal func tableView(_ tableView: UITableView, 
   cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
   let cell = UITableViewCell(style: 
   UITableViewCellStyle.default, reuseIdentifier: "Cell") 
   cell.textLabel?.text = "First Row" 
   return cell 
} 

在第一行中,我们创建一个具有默认样式的单元格,reuseIdentifier是我们制作的原型单元格的名称。

Cell.textLable?.text - 这定义了应显示为该单元格标题的文本。

最后,我们从那里返回一个单元格。现在尝试运行您的应用程序,它应该如下所示 -

重用标识符

时间表申请

在此应用程序中,我们将继续我们的上一个项目,我们将创建一个打印 2 表格 (2…10…20) 的应用程序。

因此,要制作此应用程序,只需更改项目的视图控制器文件即可。

更改功能如下所示 -

internal func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
   return 10; 
} 
internal func tableView(_ tableView: UITableView, 
   cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
   let cell = UITableViewCell(style: UITableViewCellStyle.default, reuseIdentifier: "Cell") 
} 

现在,运行您的应用程序。它应该如下所示。

时间表申请

现在,我们已经完成了表格视图并提出了申请,因此这是我们需要解决的快速挑战。

挑战

制作一个应用程序,我们在其中打印用户输入的数字的计数表。

提示- 接受输入,添加一个按钮,按下该按钮将加载表格并计算该数字。这里我们还需要以下函数,它将重新加载表数据。

tableView.reloadData()

这对您来说是一个挑战,因为我们已经涵盖了有关此应用程序的所有主题,因此我们不会为此提供解决方案。

煮蛋定时器应用

在此应用程序中,我们将使用Timer()类构造函数的概念来管理时间。我们将为您提供概念和编码。您必须自己制作 UI,因为我们已经在前面的章节中多次讨论了每个 UI 元素。(尽管我们将为所有看起来很新的东西提供提示)。

您的最终应用程序布局应如下所示 -

煮蛋定时器应用

此应用程序中会发生什么?

  • 标题标签的起始值是 210。

  • 单击播放按钮时,值应每秒减少一。

  • 单击暂停时,值应仅停在那里。

  • 单击 -10 时,值应减少 10,并且应继续减少。

  • 单击 +10 时,值应增加 10,并继续减少。

  • 单击“重置”后,值应变为 210。

  • 值绝不能低于 0。

概念

  • 我们将使用 Timer() 类的变量 → var timer = Timer()。

  • 我们将为刚刚创建的计时器变量设置一个值。

    • 计时器 = Timer.scheduledTimer(timeInterval: 1, 目标: self, 选择器: #selector(ViewController.processTimer), userInfo: nil, 重复次数: true)

    • timeInterval -> 是我们要使用的时间间隔,

    • target -> 是应该生效的视图控制器,

    • 选择器 -> 是将使用此计时器的函数名称,

    • userInfo -> null 并重复,是的,我们想重复,所以它会是真的。

使定时器失效

要通过编程停止计时器,我们将添加timer.invalidate()函数。

我们使用的元素-

导航栏- 在导航栏中,我们添加了三个项目。

  • 栏按钮项目,左侧​​一个,右侧一个。
  • 标题名为“我们的煮蛋计时器”。
导航栏

工具栏- 工具栏出现在应用程序屏幕的底部,包含用于执行与当前视图或其中内容相关的操作的按钮。

工具栏是半透明的,并且可能有背景色调。当人们不太可能需要它们时,它们经常隐藏起来。

我们在 UI 底部添加了一个工具栏,其中有 5 个项目。

  • 三个条形按钮项目,分别命名为 -10、重置和 +10。
  • 两个灵活空间:栏按钮项目之间的灵活空间 -
工具栏

如何向栏按钮项目添加图标?

选择您的栏按钮项目。单击您的栏按钮项目,转到属性检查器,单击“选择项目”,然后从出现的下拉列表中选择该项目。

图标到栏按钮

同样,选择所有其他按钮的项目并创建上面给出的 UI。将标签添加到视图的中心并将其连接为出口,将其命名为 - timeLeftLabel

启动计时器的操作

以下是启动定时器的程序。

@IBAction func startTimerButton(_ sender: Any) { 
   if !timerActive { 
      timerActive = true 
      eggTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: 
      #selector(ViewController.processTimer), userInfo: nil, repeats: true) 
   } 
}

创建以下函数 -

func stopTimer() { 
   timerActive = false 
   eggTimer.invalidate() 
}

停止功能的操作

以下是停止功能的程序。

@IBAction func pauseTimerButton(_ sender: Any) { 
   stopTimer() 
}

减少时间的动作

以下是减去时间的程序。

@IBAction func subtractTime(_ sender: Any) { 
   if timeLeft > 10 { 
      timeLeft = timeLeft - 10 
      timeLeftLabel.text = String(timeLeft) 
   } 
}

重置时间的操作

以下是重置时间的程序。

@IBAction func resetTimer(_ sender: Any) { 
   timeLeft = 210 
   timeLeftLabel.text = String(timeLeft) 
}

addTime 的操作

以下是添加时间的程序。

@IBAction func addTime(_ sender: Any) { 
   timeLeft = timeLeft + 10 
   timeLeftLabel.text = String(timeLeft) 
}

现在,viewController.swift 应该看起来像 -

import UIKit 
class ViewController: UIViewController { 
   @IBOutlet weak var timeLeftLabel: UILabel! 
   var eggTimer = Timer()  // Initialize the Timer class. 
   var timerActive = false // Prevents multiple timers from firing. 
   var timeLeft = 210  
   func stopTimer() { 
      timerActive = false 
      eggTimer.invalidate() 
   } 
     
   func processTimer() { 
      if timeLeft <= 0 { 
         stopTimer() 
         return 
      }     
      timeLeft = timeLeft - 1; 
      timeLeftLabel.text = String(timeLeft) 
   } 
    
   @IBAction func startTimerButton(_ sender: Any) { 
      if !timerActive {
         timerActive = true 
         eggTimer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: 
         #selector(ViewController.processTimer), userInfo: nil, repeats: true) 
      } 
   } 
     
   @IBAction func pauseTimerButton(_ sender: Any) { 
      stopTimer() 
   } 
    
   @IBAction func subtractTime(_ sender: Any) { 
      if timeLeft > 10 { 
         timeLeft = timeLeft - 10 
         timeLeftLabel.text = String(timeLeft) 
      } 
   } 
     
   @IBAction func resetTimer(_ sender: Any) { 
      timeLeft = 210 
      timeLeftLabel.text = String(timeLeft) 
   } 
     
   @IBAction func addTime(_ sender: Any) { 
      timeLeft = timeLeft + 10 
      timeLeftLabel.text = String(timeLeft) 
   } 
     
   override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 
   }  
   override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated
   } 
}

这就是我们在应用程序中要做的所有事情,尝试运行应用程序,它应该运行良好。

将数据存储在本地存储上

将数据存储在本地存储上是指使用本地设备的存储来存储与设备上的应用程序相关的数据。我们有两种方法将数据存储在本地存储上,即NSUserDefaultCoreData

让我们详细了解它们。

NS用户默认值

NSUserDefaults 旨在存储小块数据,例如首选项、设置或单个值。要在我们的应用程序中使用 UserDefaults,我们只需通过代码创建对 nsuserDefaults 的引用,如下所示。

let defaultValues = NSUserDefaults.standardUserDefaults()

要为 UserDefaults 中的数据设置值,我们可以使用以下代码 -

defaultValues.setObject("Simplified iOS", forKey: "nameKey")  
func setDouble(value: Double, forKey defaultName: String) 
func setBool(value: Bool, forKey defaultName: String) 
func setObject(value: AnyObject?, forKey defaultName: String) 
func setURL(url: NSURL?, forKey defaultName: String) 
func setInteger(value: Int, forKey defaultName: String) 
func setFloat(value: Float, forKey defaultName: String) 

要从 NSUserDefaults 获取值,我们可以使用以下代码。

func boolForKey(defaultName: String) -> Bool 
func integerForKey(defaultName: String) -> Int 
func floatForKey(defaultName: String) -> Float 
func doubleForKey(defaultName: String) -> Double 
func objectForKey(defaultName: String) -> AnyObject? 
func URLForKey(defaultName: String) -> NSURL? 

核心数据

CoreData是一个持久化框架,支持大数据事务。CoreData 允许您构建关系实体-属性模型来存储用户数据。CoreData是一个框架,可以使用SQLite、二进制格式来存储数据。

要在我们的应用程序中使用 CoreData,我们将从一个新项目开始,并确保在创建项目时选中“使用 Core Data”。

使用 core Data 登录- 创建一个新项目,选择使用 CoreData,如下图所示。

使用核心数据

继续直到项目打开,现在我们看到该项目比我们之前的项目有更多的文件。

核心数据

这个文件CoreData_demo.xcdatamodeld是我们的数据库,我们将在其中创建用户表并存储数据。

概念- 关于 CoreData 的事情是,即使我们关闭应用程序并在几个月后打开它,它仍然会包含我们存储的数据,我们将在我们制作的下一个应用程序中看到这些数据。

现在我们将了解如何添加核心数据和检索核心数据。

添加核心数据- 要添加 CoreData,请单击文件 CoreData_demo.xcdatamodeld,然后我们将看到实体为空。单击添加实体按钮,它将添加一个实体,现在双击实体名称并将其重命名为您喜欢的任何名称。

添加实体

现在单击实体,我们可以看到属性字段为空。单击加号并重命名该实体。从下一个字段中选择实体的类型。

属性

我们在其中添加了一个实体和一个属性。现在,如果我们转到AppDelegate.swift,我们可以看到添加了两个新函数,因为我们选择了 CoreData。添加的两个功能是 -

新增功能

注意- 在继续之前将 CoreData 导入到您的文件中。

将数据保存到 Core Data - 要在 CoreData 中保存一些数据,我们需要创建一个 AppDelegate 类的对象。

let appDelegate = UIApplication.shared.delegate as! AppDelegate

并且,上下文对象

let context = appDelegate.persistentContainer.viewContext

然后,我们需要创建一个实体对象,它将调用我们的实体 -

let newValue = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context)

我们现在将设置我们创建的属性的值。

newValue.setValue(textField.text, forKey: "name")

我们将使用保存数据

context.save();

从核心数据中获取- 获取时,上述两个步骤(创建 appDelegate 和上下文)将是相同的。然后,我们将创建一个获取请求。

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 

我们将创建一个对象来存储结果。

let results = try context.fetch(request)

然后我们将根据我们的要求检查结果。我们将在创建的下一个应用程序中看到更多 CoreData 的内容。

挑战- 尝试创建一个应用程序,用户在其中输入名称,然后单击登录并关闭应用程序。当用户下次打开应用程序时,他应该仍然处于登录状态。然后添加一个按钮 - 注销,如果他单击该按钮,应用程序将再次要求输入用户名。

使用 CoreData 登录/注销

创建一个名为“Login”的单一视图项目,选择使用 CoreData。单击 CoreData_demo.xcdatamodeld 并添加一个名为“Users”的实体。在其中添加一个名为“name”的属性。

转到 main.storyboard,添加一个文本字段和一个登录按钮。在其下方添加一个标签,双击它并删除其内容。然后,添加一个注销按钮,转到其属性检查器并将“alpha”设置为 0。现在,我们的视图应如下所示 -

查看控制器场景

现在,转到视图控制器文件,打开助理编辑器并在 UI 元素和控制器文件之间创建连接。

注意- 我们还将为这两个按钮创建出口,因为我们需要修改这些按钮的外观。例如 - 当用户登录时,我们将隐藏登录按钮,如果用户未登录,我们将显示登录并隐藏注销按钮。

正如我们已经讨论过的如何从 CoreData 添加和获取数据,我们将把代码放在这里。

Try-Catch - 您会注意到我们在代码中多次使用了 try-catch 块。这是因为如果我们不使用try-catch块并且程序中出现一些异常或错误,执行将会停止。然而,如果我们使用 try catch 块并且发生某些错误,则 catch 块会处理该错误。在我们的Swift 教程中了解更多相关信息

登录/注销应用程序代码

让我们了解用于登录/注销应用程序的不同组件和代码。

登录按钮操作- 以下代码解释了如何添加登录按钮操作。

var isLoggedIn = false 
@IBAction func logIn(_ sender: AnyObject) { 
   let appDelegate = UIApplication.shared.delegate as! AppDelegate
   let context = appDelegate.persistentContainer.viewContext 
   if isLoggedIn { 
      let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
      do { 
         let results = try context.fetch(request) 
         if results.count > 0 { 
            for result in results as! [NSManagedObject] { 
               result.setValue(textField.text, forKey: "name") 
               do { 
                  try context.save() 
               } 
               catch { 
                  print("Update username failed") 
               } 
            } 
            label.text = "Hi " + textField.text! + "!" 
         } 
      } 
      catch { 
         print("Update failed") 
      } 
   } else { 
      let newValue = NSEntityDescription.insertNewObject(forEntityName: "Users", into: context) 
      newValue.setValue(textField.text, forKey: "name") 
      do { 
         try context.save() 
         logInButton.setTitle("Update username", for: []) 
         label.alpha = 1 
         label.text = "Hi " + textField.text! + "!" 
         isLoggedIn = true 
         logOutButton.alpha = 1 
      }  
      catch { 
         print("Failed to save") 
      }     
   } 
}    

注销按钮操作- 以下代码解释了如何添加注销按钮操作。

@IBAction func logOut(_ sender: AnyObject) { 
   let appDelegate = UIApplication.shared.delegate as! AppDelegate 
   let context = appDelegate.persistentContainer.viewContext 
   let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
   do { 
      let results = try context.fetch(request) 
      if results.count > 0 { 
         for result in results as! [NSManagedObject] { 
            context.delete(result) 
            do { 
               try context.save() 
            } catch { 
               print("Individual delete failed") 
            } 
         } 
         label.alpha = 0 
         logOutButton.alpha = 0 
         logInButton.setTitle("Login", for: []) 
         isLoggedIn = false 
         textField.alpha = 1 
      } 
   } catch { 
      print("Delete failed") 
   } 
}

ViewDidLoad() - 以下代码解释了如何使用 ViewDidLoad() 函数。

override func viewDidLoad() { 
   super.viewDidLoad() 
   // Do any additional setup after loading the view, typically from a nib.
   let appDelegate = UIApplication.shared.delegate as! AppDelegate 
   let context = appDelegate.persistentContainer.viewContext 
   let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Users") 
   request.returnsObjectsAsFaults = false 
   do { 
      let results = try context.fetch(request) 
      for result in results as! [NSManagedObject] { 
         if let username = result.value(forKey: "name") as? String { 
            logInButton.setTitle("Update username", for: []) 
            logOutButton.alpha = 1 
            label.alpha = 1 
            label.text = "Hi there " + username + "!" 
         }     
      } 
             
   } catch { 
      print("Request failed") 
   } 
}        

请记住,您必须为这两个按钮创建一个出口和一个操作。

现在,保存并运行该应用程序。登录,关闭应用程序并再次运行。它应该如下所示。

出口

这就是我们对 CoreData 所做的一切。使用相同的概念,我们可以构建许多 CoreData 应用程序。

控制键盘

在本节中,我们将学习控制键盘Behave。例如 – 当我们在输入一些文本后单击文本字段外部时,键盘不会关闭。在这里,我们将了解如何控制键盘。

单击输入字段外部时键盘应该消失

这是一个简单的任务,只需将以下代码粘贴到您的 viewController 文件中,然后关闭大括号即可。

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
   self.view.endEditing(true)  
}

通过这样做,它将使键盘在输入字段外部单击时消失。

点击返回键后键盘应该消失

为了使键盘消失,我们应该为视图控制器添加一个新的类型。我们还将添加一个文本字段并创建其名为 textField 的出口。最后,我们将添加UITextFieldDelegate

UITextFieldDelegate

我们还将控制并从输入字段拖动到视图控制器,并从出现的选项中选择委托。

然后,我们将添加以下功能。

func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
   textField.resignFirstResponder()  
   return true 
}

最终的视图控制器文件应如下所示 -

import UIKit 
class ViewController: UIViewController, UITextFieldDelegate { 
   override func viewDidLoad() { 
      super.viewDidLoad() 
      // Do any additional setup after loading the view, typically from a nib. 
   }  
   override func didReceiveMemoryWarning() { 
      super.didReceiveMemoryWarning() 
      // Dispose of any resources that can be recreated. 
   } 
   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
      self.view.endEditing(true) 
   }
   func textFieldShouldReturn(_ textField: UITextField) -> Bool { 
      textField.resignFirstResponder() 
      return true 
   } 
}    

下载网页内容 - 打开 Facebook/Google

在本节中,我们将学习如何制作一个应用程序,当分别按下每个按钮时,该应用程序将打开 Facebook 和 Google。我们还将学习 Web 视图和应用程序传输层安全性的概念。之后,您将能够制作自己的浏览器。

注意- 我们在此应用程序中需要互联网连接。

制作网络应用程序

我们将制作一个新的单视图应用程序,iOS 项目。在对象库的搜索栏中,我们将搜索 Web 视图,将其拖动并将其添加到 main.Storyboard 中的视图控制器中。

添加网络视图后,我们将其拉伸到所有角落。应用程序用户界面应如下所示 -

应用程序用户界面

我们将通过单击助理编辑器打开 main.storyboard 和视图控制器。我们将为我们的 webView 创建一个出口,并为两个按钮创建一个操作。加载时,应用程序将在 webView 中加载 yahoo。单击 google 时,应加载 Google,单击 Facebook 按钮时,应加载 Facebook 页面。

最终视图应如下所示 -

最终视图

以下屏幕截图显示了我们应用程序的不同屏幕的外观。如果您尝试打开非 https 的 Web 服务,它将显示错误,我们必须在您的info.plist文件中添加应用程序传输层安全例外。

信息列表

iOS 开发 Swift 2 - 集成地图

地图已经成为每个人日常生活的一部分。当我们去某个地方旅行或搜索某个地方时,它们变得非常有用。

整合地图并定位印度门

我们将在我们的应用程序中制作地图,这将向我们展示位于中心的印度门。我们将通过在项目中实现来学习地图。因此,创建一个单视图 iOS 应用程序并将其命名为您想要的名称。

添加地图套件视图

转到对象库并搜索地图套件视图,单击拖动并将其带到您的视图中,拉伸它以使其填充整个视图。

添加

添加约束

通过control+拖动为mapViewKit创建一个outlet来查看controller.swift文件。现在可能会显示错误,但我们会处理它。在文件顶部的 import UIKIT 下方,添加 import MapKit,这将消除错误。

之后,在类ViewController:UIViewController之后添加MKMapViewDelegate。现在,该文件应如下所示 -

添加约束

现在,我们将为地图创建纬度和经度、增量、跨度、位置和区域。在此之前,我们将告诉您如何获取地点的纬度和经度。

转到maps.google.com 并搜索某个位置。在顶部,我们将看到 URL 中的纬度和经度。例如:让我们搜索印度门。

谷歌地图

设置纬度和经度

获取纬度和经度后,我们将为它们创建变量。

let latitude: CLLocationDegrees = 28.610 
let longitude: CLLocationDegrees = 77.230 

设置纬度和经度的 Delta

添加完纬度和经度后,我们会为它们添加delta,这个值就是可以验证我们的经纬度的值。对于更多准确的位置,它们应该保持最小。

let latDelta: CLLocationDegrees = 0.04 
let lonDelta: CLLocationDegrees = 0.04 

设置地图的跨度、位置和区域

然后我们将为我们的地图创建一个跨度、位置和区域。

let span: MKCoordinateSpan = MKCoordinateSpan(latitudeDelta: latDelta,
longitudeDelta: lonDelta)  
let location: CLLocationCoordinate2D = CLLocationCoordinate2D(latitude:
latitude, longitude: longitude)  
let region: MKCoordinateRegion = MKCoordinateRegion(center: location, span: span)

设置地图

我们将使用以下命令设置地图。

mapView.setRegion(region, animated: true)

我们的最终应用程序应如下图所示。

最终应用程序截图

我们应该注意我们的位置集正好位于应用程序的中心。这就是我们现在要对地图所做的一切。

使用 Swift 2 进行 iOS 开发 - 自动布局

当我们制作 iOS 应用程序并在该应用程序中添加 UI 元素时,它们在一台设备上可能看起来很完美。尽管如此,现在我们应该在其他设备上尝试相同的应用程序。我们肯定会看到用户界面发生巨大变化,并且某些元素可能也不会出现。

自动布局是我们用来解决这个问题的技术。在本章中,我们将了解如何进行自动布局、应用约束和堆栈视图,以使您的应用程序在每种设备上看起来完美且最佳。

我们将从创建一个新的单视图应用程序开始。

添加元素

在视图的顶部中心添加一个标签,在视图的右下角添加一个标签,如下所示 -

中心

现在,尝试改变方向,我们会看到右下角没有出现,而中心也不在中心。

提示- 您不需要运行模拟器来查看布局,只需单击屏幕底部的“查看为 - iPhone x”,如以下屏幕截图所示。)

IPhone

选择 iPhone 版本和方向。我们会看到 UI 元素排列不正确。因此,当我们改变方向、设备或两者时,右下标签将消失,并且中心不会位于中心。

中心变化

发生这种情况是因为我们没有指定元素的固定位置。为了解决这个问题,我们将使用约束。

对 UI 元素应用约束

单击中心标签,按下 Control 并将其拖动到视图内的任意位置,然后释放。现在你一定看到了 -

中心水平

选择“容器中水平居中”。再次重复上述步骤并选择顶部布局指南的垂直间距。

垂直间距

现在,单击“添加新约束”按钮并选择高度和宽度,然后单击“添加 2 个约束”。

添加 2 个约束

单击右下角标签,控制从标签拖动到视图内的任意位置,然后选择“尾随空格到容器边距”。同样选择“垂直间距到底部布局指南”。

(提示- 要一次选择多个选项,请按 Shift 并选择选项。确保在选择所有内容之前不要释放 Shift。)

应用所有约束后,视图应如下所示 -

应用约束后查看

堆栈视图

堆栈视图通过在堆栈中排列元素来工作。排列后,我们只定义一次约束,所有元素都会相应排列。要从堆栈视图开始,请创建以下视图,该视图在其他设备中看起来不会更好。但是,我们将在本节中使其适用于其他设备。

堆栈视图

现在,选择顶部的两个按钮 - 选择一个按钮,按下命令,然后选择第二个按钮。要将它们嵌入到堆栈视图中,请转到编辑器→嵌入→堆栈视图。

或者

右下角-h