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.