Swift2 iOS 高级开发



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

请仔细阅读每个部分,因为本章包含开发应用程序所需的大部分内容。

多个视图控制器

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

因此,我们将从创建一个新项目开始;这个项目的名称有多个视图。与其他项目一样,这个项目也包含一个视图控制器和一个用于该控制器的 Swift 文件。(您可以通过选择视图并在“Identity Inspector”(身份检查器)中查看其属性来查看这一点。)

以下屏幕截图显示了当前视图的外观:

Entry Point

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

添加第二个多视图控制器

要向我们的应用程序添加其他视图控制器,我们将在对象库中搜索视图控制器。找到后,我们将视图控制器拖到我们的 main.storyboard 中,位于任何其他视图之外。

Second Multiple View Controller

您的应用程序应该如下所示。现在,我们添加了一个视图控制器,但现在我们还需要为新添加的视图创建一个视图控制器类。

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

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

类字段现在应该为空,因此单击该字段并开始键入您在上一步中添加的类名。如果出现,单击回车键。

Second View Controller

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

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

向应用程序添加导航

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

Adding Navigation To Application

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

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

添加导航控制器

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

Editor

现在,我们的应用程序应该如下面的屏幕截图所示。

Screenshot

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

向导航栏添加标题和返回按钮

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

Title Back Button
  • 标题 - 这将是导航栏的标题,显示在中央。

  • 提示 - 这显示在标题栏的顶部,在中央。

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

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

添加栏按钮项

在对象库中搜索栏按钮项,然后将其拖放到导航栏的右侧。将其命名为 – “下一步 >”,从它控制拖动到第二个视图,像我们添加最后一个按钮一样选择“显示”。

Adding Bar Button

现在运行应用程序,它看起来会更简洁美观。这就是我们现在对导航所做的全部工作。在后续章节中,如有需要,我们将使用 Swift 代码修改导航栏。

表格视图

表格将数据呈现为包含多个行的单列列表,这些行可以进一步划分为多个部分。表格应用于以清晰有效的方式呈现数据。

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

添加表格视图

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

Table View

添加原型单元格

拉伸表格视图以覆盖整个视图,突出显示表格视图。检查其属性检查器,其中有一个名为“原型单元格”的字段,当前值为 0。我们应该将其值更改为 1,现在您的视图应该如下所示:

Prototype Cells

更改单元格标识符

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

Table View Cell

添加委托和数据源

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

Delegate Data Source

当我们释放光标时,我们将看到两个选项,dataSource 和 delegate,逐个选择它们(当您选择任何一个选项时,弹出窗口将隐藏,您需要重复上述步骤才能添加第二个选项)。现在它应该如下所示:

Outlets

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

Table View Delegate View Data Source

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

Xcode Error

这是因为有一些方法我们需要使用UITableView

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

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

Uitableview

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 - 这定义了应作为该单元格标题显示的文本。

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

Reuse Identifier

时间表应用程序

在这个应用程序中,我们将继续我们的上一个项目,我们将创建一个打印 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") 
} 

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

Time Table Application

现在,由于我们已经完成了表格视图并创建了一个应用程序,因此这是一个我们需要解决的快速挑战。

挑战

创建一个应用程序,我们打印用户输入的任何数字的计数表。

提示 - 获取输入,添加一个按钮,当按下该按钮时,将加载该数字的计数表。在这里,我们还需要以下函数,它将重新加载表格数据。

tableView.reloadData()

这是一个挑战,因为我们已经介绍了关于此应用程序的所有主题,因此我们不会为此提供解决方案。

计时器应用程序

在此应用程序中,我们将使用Timer()类构造函数的概念来管理时间。我们将为您提供概念和代码。您必须自己创建 UI,因为我们已经在之前的章节中多次讨论过每个 UI 元素。(尽管我们将为所有看起来相当新的内容提供提示)。

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

Egg Timer Application

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

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

  • 点击播放按钮后,数值应每秒减少一。

  • 点击暂停按钮后,数值应保持不变。

  • 点击“-10”按钮后,数值应减少10,并继续递减。

  • 点击“+10”按钮后,数值应增加10,并继续递减。

  • 点击重置按钮后,数值应变为210。

  • 数值绝不能低于0。

概念

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

  • 我们将为此变量设置一个值。

    • timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.processTimer), userInfo: nil, repeats: true)

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

    • target -> 是应该被影响的视图控制器,

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

    • userInfo -> 为nil,repeats为true,表示我们希望重复执行。

使计时器失效

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

我们使用的元素

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

  • 栏按钮项,一个在左边,一个在右边。
  • 标题命名为 – “我们的鸡蛋计时器”。
Navigation Bar

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

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

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

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

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

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

Icon to Bar Button

同样,为所有其他按钮选择项目,并创建如上所示的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) 
}

添加时间的操作

以下是添加时间的程序。

@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

让我们详细了解它们。

NSUserDefaults

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允许您构建关系实体-属性模型来存储用户数据。CoreData是一个框架,可以使用SQLite、二进制格式来存储数据。

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

使用Core Data登录 − 创建一个新项目,选择使用CoreData,如下面的屏幕截图所示。

Use Core Data

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

Core Data

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

概念 − CoreData的特点是,即使我们关闭应用程序,并在几个月后打开它,它仍然会保留我们存储的数据,这将在我们创建的下一个应用程序中看到。

现在我们将看到如何添加Core Data和检索Core Data。

添加Core Data − 要添加CoreData,单击CoreData_demo.xcdatamodeld文件,然后我们将看到实体是空的。单击“添加实体”按钮,它将添加一个实体,现在双击实体名称并将其重命名为您喜欢的任何名称。

Add Entity

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

Attributes

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

Functions Added

注意 − 在继续之前,请在您的文件中导入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();

从Core Data中获取 − 在获取过程中,以上两个步骤(创建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。现在,我们的视图应如下所示 −

View Controller Scene

现在,转到您的视图控制器文件,打开助手编辑器并在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") 
   } 
}        

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

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

Outlet

这就是我们将使用CoreData做的全部工作。使用相同的概念,我们可以构建许多CoreData应用程序。

控制键盘

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

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

这是一个简单的任务,要执行此操作,只需将以下代码粘贴到您的viewController文件中,在闭合的大括号之前。

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

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

按回车键时,键盘应消失

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

UITextFieldDelegate

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

然后,我们将添加以下函数。

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视图和应用程序传输层安全性的概念。之后,您将能够创建自己的浏览器。

注意 − 此应用程序需要互联网连接。

制作Web应用程序

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

添加web视图后,我们将将其拉伸到所有角落。应用程序UI应如下所示 −

Application UI

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

最终视图应如下所示 −

Final View

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

Infoplist
广告
© . All rights reserved.