- Swift 2 iOS 開發
- iOS 開發 - 首頁
- iOS 開發 - Xcode IDE
- iOS 開發 - 第一個應用程式
- 使應用程式互動
- iOS 開發 - Swift Playground
- 使用 Swift 建立應用程式
- iOS 開發 - 高階 iOS
- iOS 開發 - 整合地圖
- iOS 開發 - 自動佈局
- iOS 開發 - 動畫
- 訪問 Web 服務
- 併發控制
- 面試問題
- iOS 開發有用資源
- iOS 開發 - 快速指南
- iOS 開發 - 資源
- iOS 開發 - 討論
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 是 Apple 為 iOS/OS X 應用程式開發提供的預設 IDE(整合開發環境)。它是一個 IDE,包含開發 iOS、OS X、Watch OS、TV OS 應用程式等所需的一切。
要執行 Xcode,您必須擁有:
- 執行 OS X 的 Mac 裝置,即 Apple 的官方作業系統。
- Apple ID(免費):用於下載 IDE。
安裝
要在您的裝置上安裝 Xcode,請按照以下步驟操作。如果您已安裝,請跳過。
轉到 App Store,如果尚未登入,請登入,搜尋 Xcode。點選獲取並安裝。
下載完成後,轉到應用程式或 Launchpad 並執行您的應用程式。
在第一次執行時,它可能會要求進行一些其他下載,讓它下載所有內容,如果它要求輸入密碼,請輸入。
完成所有這些操作後,將顯示歡迎螢幕,如下所示。
iOS 開發 Swift 2 - 第一個應用程式
在本教程中,我們將學習一些 iOS 開發的基本概念,包括:
- 建立新專案
- IDE 的功能
- 瀏覽 IDE
- 向您的檢視新增標籤
- 執行應用程式
- 根據您的舒適度調整模擬器
如果您是初學者,那麼本教程將對您有很大幫助。
建立新的 Xcode 專案
要建立新的 Xcode 專案,我們應該按照以下步驟操作。
步驟 1 − 點選 Launchpad 中的 Xcode 圖示,然後選擇建立新的 Xcode 專案。
步驟 2 − 選擇 iOS,然後選擇 Single View Application,點選 Next。
步驟 3 − 隨後出現的螢幕將有一些欄位需要填寫。以下幾點說明了如何填寫每個欄位。
輸入專案名稱 - 它可以是類似於您的專案的名稱。
團隊欄位現在可以留空。當我們在團隊中建立應用程式時使用它。
組織名稱是您組織的名稱,或者如果它是您的個人專案,您可以將其命名為任何名稱。除非您想將您的應用程式釋出到應用商店,否則它無關緊要。
識別符號通常是應用程式的唯一識別符號,它不能與應用商店中的任何其他應用程式匹配(僅當您選擇將應用程式上傳到應用商店時)。
語言將是 Swift,裝置將是通用的,所有其他選項現在都將取消選中。
填寫完所有詳細資訊後,點選 Next 按鈕。
步驟 4 − 選擇要儲存專案的的位置。現在讓“建立 Git 儲存庫”複選框保持未選中狀態,因為我們現在不需要它。點選 Create。
恭喜!您的專案已建立。
瀏覽 Xcode 環境
點選導航器面板內的Main.storyboard選項。這將顯示主檢視,應用程式執行時將顯示該檢視。
新增標籤
在螢幕的右下角有一個搜尋欄。在該搜尋欄中鍵入 label 並按回車鍵。
搜尋標籤後,將標籤拖放到您的主檢視中。雙擊標籤文字並鍵入“Hello World”。
將標籤拖到檢視的中心,當標籤正好位於中心時,將出現兩條在中心相交的線。
現在您的檢視應如下面的螢幕截圖所示。
執行應用程式
選擇您的裝置,點選右上角的播放按鈕。
這是我們的最終應用程式,在 iPhone 7 模擬器上執行。
調整模擬器屬性
當我們第一次執行應用程式時,模擬器的螢幕可能不適合您的桌面或筆記型電腦螢幕。因此,當您的模擬器在前臺執行時,點選 Window → Scale,並選擇適合您顯示器的模擬器螢幕尺寸百分比。
在本教程中,我們將在使用模擬器功能時繼續討論模擬器功能。
做得好,這是您成功完成的第一個應用程式。乾杯!
使應用程式互動
在本章中,我們將介紹一些 iOS 提供的新功能和 UI 功能,以實現與使用者的互動。我們將新增:
- 文字欄位
- 標籤
- 按鈕及其操作
此外,我們將用 Swift 編寫動態標籤的程式碼,該標籤將顯示使用者輸入的計算結果。
透過“使我們的應用程式互動”這個標題,我們的意思是使我們的應用程式與使用者互動。因此,在這裡我們賦予使用者互動和控制應用程式的能力。
新增文字欄位
在這裡,我們將再次建立一個新專案。它應該易於管理,因為我們已經討論瞭如何在 Xcode 中建立新專案。
好的,所以我們現在將建立一個名為“My Dog’s Age”的新專案。建立此專案後,我們將點選“Main.storyboard”檔案並按照以下步驟操作。
在實用程式窗格的搜尋欄(位於 Xcode 的右下角)中,搜尋 Label。點選並將該標籤拖到您的 main.storyboard /(檢視)中。然後,雙擊標籤並將其重新命名為 -“My Dog’s Age”。
搜尋“文字欄位”,點選並將該文字欄位拖到您的檢視中。在選中此文字欄位時,轉到屬性檢查器並將鍵盤型別更改為數字鍵盤,以便只能輸入數字,如下面的螢幕截圖所示。
向我們的檢視新增按鈕
現在在搜尋欄中搜索 Button。將其拖到您的檢視中,雙擊它並將其重新命名為“Calculate”。
向檢視新增標籤
搜尋標籤並將其新增到按鈕下方,以顯示年齡輸出。雙擊並使標籤為空並將其稍微拉伸,以便完整的輸出可見。
提示 − 如果您無法透過雙擊重新命名,則選擇該專案,在實用程式窗格 - 屬性檢查器中,有該專案的標題,在其中修改並按回車鍵,如下面的螢幕截圖所示。
現在,您的 Main.storyboard 應如下面的螢幕截圖所示。
我們不會止步於此,現在我們將討論如何向 main.storyboard 新增影像。
向我們的檢視新增影像
首先,我們應該搜尋要新增到專案中的影像。您可以下載以下提供的影像:
將此影像複製到您的專案中,或將此影像拖到您的專案中,然後您將看到以下視窗。
確保選中“如果需要,複製專案”並“建立組”。點選 Finish 按鈕。
現在,轉到 Utility Pane → Object Library 並搜尋 Image views。將影像檢視拖到您的檢視中。現在您的檢視應如下面的螢幕截圖所示。
現在,點選您剛剛拖到檢視中的此 Image View,然後您將在實用程式區域中看到一個名為“Image”的選項以選擇影像。點選該箭頭,您將看到所有可用的影像。確保您已選擇此新新增的影像檢視。
現在您已為影像檢視選擇了影像,您的最終檢視應如下面的螢幕截圖所示。這是我們對該應用程式的 main.storyboard 所做的唯一操作。
新增所有 UI 元素後,這就是我們現在的檢視。
在此之後,我們將對程式碼進行邏輯實現,如果您已完成此步驟,我們將繼續進行。
現在,選擇您的檢視控制器,並透過點選右上角的助手編輯器按鈕(如下面的螢幕截圖所示)開啟助手編輯器。
現在,我們的檢視應如下面的螢幕截圖所示。
向我們的應用程式新增功能
到目前為止,我們的應用程式只是一個靜態應用程式,它對任何操作都沒有響應,也不會根據使用者交互發生變化。
現在是將我們的 UI 元素連線到我們的程式碼的主要部分,並且 UI 將根據使用者的輸入發生變化。“ViewController.swift”檔案是我們的主檔案,我們將在其中為當前檢視編寫程式碼。
注意 − 目前我們正在使用單個檢視,稍後當我們討論多個檢視時。我們將討論不同的檔案如何控制不同的檢視。
點選文字欄位,按住 control 鍵並將游標拖到螢幕的第二部分,即 viewcontroller.swift 檔案。您將看到一條連線我們的檢視和 swift 檔案的藍線。釋放滑鼠時,您將看到一個彈出視窗,要求輸入。
提示 − 使用任何類似於您的輸入欄位的名稱填寫 Name 欄位。一個重要的點是名稱不能包含空格,因此您可以像前面影像中顯示的那樣編寫它,即如果名稱包含多個單詞,則第一個單詞應以小寫字母開頭,然後每個後續單詞的第一個字母將大寫。
遵循相同的步驟並連線其餘的元素。請記住,對於文字欄位和標籤,型別是 Outlet。但是,在新增按鈕時,型別必須是 action,如下面的螢幕截圖所示。
在此階段,我們的 viewcontroller.swift 將如下所示:
現在,在你的按鈕操作中,新增以下幾行程式碼:
var age = Int(enteredAge.text!)! * 8 yearsLabel.text = String(age);
提示 − 在 Swift 中,我們不需要在行尾新增分號,即使添加了分號,編譯器也不會報錯。
在上面的程式碼中,第一行聲明瞭一個變數'age',我們將在下一章討論它。然後,我們透過將其轉換為整數並乘以 8,來賦值使用者輸入的值。
在第二行,我們將'age'的值賦值給我們的輸出標籤。在這個階段,我們的檢視控制器將如下所示:
現在,我們將執行我們的應用程式,它將顯示如下。
提示 − 如果你的鍵盤在第一次執行時沒有出現,開啟你的模擬器,點選硬體,轉到鍵盤,然後點選切換軟體鍵盤。
在下一章,我們將討論一個名為Playground的新工具。我們還將學習更多 Swift 的概念,如變數、字典、陣列迴圈、類和物件。
使用 Swift 2 進行 iOS 開發 - Playground
在本章中,我們將介紹一個新的環境,我們可以在其中編寫和執行 Swift 程式碼。我們還將涵蓋 Swift Playground 的以下方面:
- 變數
- 字典
- 陣列
- 迴圈
- 類與物件
注意 − 我們只會講解在本教程中用到的基礎概念,如果你想深入學習 Swift,可以檢視我們的Swift 教程。
Playground 是 Xcode 提供的一個用於執行 Swift 程式碼的工具。我們將從建立一個新的 Playground 開始。
啟動 Swift Playground
要建立一個 Swift Playground,請點選 Xcode 圖示,並選擇第一個選項,使用 Swift Playground 開始。
為你的 Playground 命名,並選擇平臺為 iOS。讓我們將我們的 Playground 命名為 Demo Playground。點選下一步。
這些是建立 Playground 所需遵循的唯一步驟。以下螢幕截圖顯示了 Playground。
| 序號 | 基本概念與描述 |
|---|---|
| 1 | 變數
變數是程式可用於儲存和操作資料的記憶體/儲存空間。每個變數都有特定的資料型別,該型別決定了變數在記憶體中佔用的大小。 |
| 2 | 字典
字典是一種集合,它以鍵值對的形式儲存值,即字典中儲存的資料以一種方法儲存,其中每個值都與一個鍵相關聯。在這裡,每個鍵都是唯一的,並且不能在同一個字典中出現兩次。 |
| 3 | 陣列
陣列是資料型別,用於按順序列表儲存相同型別的資料。相同的值可以出現在陣列中的多個索引/位置。 |
| 4 | 迴圈(控制流)
Swift 提供了各種控制流語句。迴圈通常用於多次迭代條件或語句,直到滿足迴圈的條件/程式設計師的需求。 |
| 5 | 類和物件
類是通用的靈活結構,是程式程式碼的構建塊。 物件通常用於指代類的例項,因此我們可以稱其為例項而不是物件。 |
使用 Swift 建立應用程式
在本章中,我們將使用 Swift 建立兩個新的應用程式。
第一個應用程式 – “猜數字”
在本節中,我們將建立一個名為“猜數字”的應用程式。要建立此應用程式,請建立一個新的 iOS 單檢視應用程式,並將其命名為你想要的任何名稱。
點選main.storyboard並選擇你的主檢視。
新增一個文字標籤→將文字更改為“猜數字”。更改顏色、大小屬性,並根據你的需求進行設定。
新增一個輸入欄位,拉伸到全檢視。
新增一個按鈕,並將其命名為“猜”。
再新增一個標籤,拉伸它,並清空文字框。
新增所有元素後,你的檢視應該如下所示。
現在切換到輔助編輯器,並點選從你的 UI 元素拖動到檢視控制器檔案,然後將文字欄位連線為出口並將其命名為 userInput。同樣地,
- 將空標籤連線為出口並將其命名為 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 + "."
}
}
你的最終應用程式現在應該如下所示。
現在讓我們執行我們的應用程式並檢查其輸出。起始螢幕應如下所示:
接下來,在輸入區域輸入一個數字。
讓我們再輸入一個數字並檢查其輸出:
我們已經完成了另一個應用程式。嘗試執行此應用程式,並輸入不同的輸入。
第二個應用程式 – “它是素數嗎”
在此應用程式中,我們將從使用者那裡獲取輸入,並檢查該數字是否為素數:
佈局 − 與之前的應用程式類似,我們需要一個輸入、一個按鈕和一個輸出標籤。
挑戰 − 建立 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.stroryboard 中,位於任何其他檢視的外部。
你的應用程式應該如下所示。現在,我們添加了一個檢視控制器,但是現在我們還需要為新新增的檢視建立一個檢視控制器類。
右鍵點選你的專案→新建檔案→Cocoa Touch 類→將其命名為你想要的任何名稱,我們將將其命名為“SecondViewController”。
這就是你為檢視控制器建立類檔案的方法。現在,返回到你的“main.storyboard”,點選你的第二個檢視控制器,並檢視其“身份檢查器”。
類欄位現在應該是空的,所以點選該欄位並開始鍵入你在上一步中新增的類名。如果出現,點選回車。
我們現在已經建立了一個多個檢視控制器,併為該檢視添加了控制器類檔案。但是,如果你執行應用程式,它仍然不會顯示你的第二個檢視。為什麼?
因為我們還沒有新增一個函式來將我們帶到該檢視。簡而言之,我們還沒有向我們的應用程式新增導航。不用擔心;我們將在下一節中介紹它。
嚮應用程式新增導航
從一個檢視過渡到另一個檢視的過程稱為Segueing,即透過在兩個檢視之間建立 segue 來完成。為此,在第一個檢視控制器中新增一個按鈕,並從它控制拖動到第二個檢視。當你釋放按鈕時,你將看到一些選項,如下面的螢幕截圖所示。
從“操作 Segue”中選擇“顯示”選項。現在執行你的應用程式,你將看到點選按鈕後,你的第二個檢視出現了(為了更清楚地看到,在第二個檢視中新增一些內容,以便你可以識別)。
但是,現在你無法返回到第一個檢視。為此,我們有導航控制器。
新增導航控制器
選擇你的第一個檢視控制器,並在頂部欄中點選編輯器→嵌入到→導航控制器。
現在,我們的應用程式應該如下面的螢幕截圖所示。
我們應該確保在檢視頂部有一行淺灰色的行。現在,當我們執行應用程式時,可以看到檢視頂部有一個導航欄。當我們點選按鈕時,我們將轉到第二個檢視,在那裡我們將看到導航欄中的一個返回按鈕。點選它,我們將返回到初始檢視。
嚮導航欄新增標題和返回按鈕
要向你的導航欄新增標題,請點選導航欄,並檢視其屬性檢查器。在那裡我們將看到:
標題 − 這將是導航欄的標題,顯示在中心。
提示 − 這顯示在標題欄的頂部,在中心。
返回按鈕 − 在這裡你可以修改返回按鈕中顯示的文字。
當前傳遞檢視的按鈕位於我們的檢視上,如果我們希望螢幕上顯示其他內容,則可能不合適。因此,我們將嚮導航欄中新增一個欄按鈕項,該項將帶我們到第二個檢視。但是,為此我們應該首先刪除我們新增的最後一個按鈕。
新增欄按鈕項
在物件庫中搜索欄按鈕項,並將其拖放到導航欄的右側。將其命名為 –“下一步>”,從它控制拖動到第二個檢視,選擇“顯示”,就像我們新增的最後一個按鈕一樣。
現在執行應用程式,它將看起來更簡潔美觀。這就是我們現在對導航所做的全部操作。在後續章節中,我們將在需要時使用 Swift 程式碼修改導航欄。
表格檢視
表格將資料顯示為包含多個行的單列列表,這些行可以進一步細分為多個部分。表格應該用於以清晰有效的方式呈現資料。
在本節中,我們將瞭解如何新增表格檢視、新增原型單元格、為表格檢視新增資料來源和委託、更改表格屬性以及為表格檢視單元格設定動態資料。
新增表格檢視
要新增表格檢視,我們首先建立一個新專案並將其命名為“tableView”。然後,轉到物件庫並搜尋表格檢視,我們將看到表格檢視、表格檢視控制器以及許多其他選項。但是,我們應該選擇表格檢視,將其拖動並新增到預設的檢視控制器中。
新增原型單元格
在表格檢視突出顯示時,將其拉伸以覆蓋整個檢視。檢查其屬性檢查器,有一個名為“原型單元格”的欄位,當前值為 0。我們應將其值更改為 1,現在您的檢視應如下所示:
更改單元格識別符號
現在,在您的檢視中,點選您的原型單元格(這有點棘手)。因此,在您的文件大綱中,點選檢視控制器 → 檢視 → 表格檢視 → 表格檢視單元格,現在在其屬性檢查器中有一個名為“識別符號”的列,點選它並將其命名為“Cell”。請參閱以下螢幕截圖以瞭解上述步驟。
新增委託和資料來源
為了使我們的表格檢視動態化,我們需要它們載入動態資料。因此,我們需要一個委託和一個數據源。要建立表格的委託和資料來源,請從表格檢視控制拖動到您的檢視控制器或檢視控制器頂部的黃色按鈕,如下面的螢幕截圖所示。
當我們釋放游標時,我們將看到兩個選項,dataSource 和 delegate,逐一選擇它們(當您選擇任何一個選項時,彈出視窗將隱藏,您需要重複上述步驟以新增第二個選項)。現在它應該如下所示:
這就是我們現在對 UI / Main.Storyboard 做的所有操作。現在切換到“ViewController.swift”檔案。將UITableViewDelegate, UITableViewDataSource 新增到您的 ViewController.swift 中,如下所示:
但是,現在 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。
點選播放按鈕後,值應每秒減少 1。
點選暫停後,值應僅停留在那裡。
點選 -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 -> null 和 repeats,是的,我們想要重複,所以它將為 true。
使計時器失效
要透過程式設計停止計時器,我們將新增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)
}
新增時間的操作
以下是新增時間的程式。
@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
}
}
這就是我們將在應用程式中執行的所有操作,嘗試執行應用程式,它應該可以正常執行。
在本地儲存中儲存資料
在本地儲存中儲存資料意味著使用本地裝置的儲存來儲存與裝置上應用程式相關的資料。我們有兩種方法可以在本地儲存中儲存資料,即NSUserDefault 和CoreData。
讓我們詳細瞭解它們。
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,如下面的螢幕截圖所示。
繼續直到專案開啟,現在我們看到該專案比我們以前的專案有更多的檔案。
此檔案CoreData_demo.xcdatamodeld 是我們的資料庫,我們將在其中建立使用者表並存儲資料。
概念 - CoreData 的特點是,即使我們關閉應用程式,並在幾個月後開啟它,它仍然會保留我們儲存的資料,我們將在我們建立的下一個應用程式中看到這一點。
現在我們將瞭解如何新增 Core Data 和檢索 Core Data。
新增 Core Data - 要新增 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();
從 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。現在,我們的檢視應如下所示:
現在,轉到你的檢視控制器檔案,開啟助理編輯器並在 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 應用程式。
控制鍵盤
在本節中,我們將學習如何控制鍵盤行為。例如 – 當我們在輸入一些文字後點擊文字欄位外部時,鍵盤不會關閉。在這裡,我們將瞭解如何控制鍵盤。
點選輸入欄位外部時鍵盤應消失
這是一個簡單的任務,要做到這一點,只需將以下程式碼貼上到你的 viewController 檔案中,在閉合的花括號之前。
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.view.endEditing(true)
}
透過這樣做,它將使鍵盤在點選輸入欄位外部時消失。
按下回車鍵時鍵盤應消失
為了使鍵盤消失,我們應該為我們的檢視控制器新增一個新的型別。我們還將新增一個文字欄位並建立其名為 textField 的出口。最後,我們將新增 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
}
}
下載 Web 內容 − 開啟 Facebook/Google
在本節中,我們將學習如何製作一個應用程式,當分別按下每個按鈕時,該應用程式將開啟 Facebook 和 Google。我們還將學習 Web 檢視和應用傳輸層安全性的概念。在此之後,你將能夠製作自己的瀏覽器。
注意 − 此應用程式需要網際網路連線。
製作 Web 應用程式
我們將建立一個新的單檢視應用程式,iOS 專案。在物件庫的搜尋欄中,我們將搜尋 web 檢視,將其拖動並新增到 main.Storyboard 中的檢視控制器中。
新增 web 檢視後,我們將將其拉伸到所有角落。應用程式 UI 應如下所示 −
我們將透過點選助理編輯器開啟我們的 main.storyboard 和檢視控制器。我們將為我們的 webView 建立一個出口,併為這兩個按鈕建立操作。載入時,應用程式將在 webView 中載入 yahoo。點選 google,它應該載入 Google,點選 Facebook 按鈕,它應該載入 Facebook 頁面。
最終檢視應如下所示 −
以下螢幕截圖顯示了應用程式的不同螢幕應如何顯示。如果你嘗試開啟一個不是 https 的 Web 服務,它將顯示錯誤,我們將不得不在你的 info.plist 檔案中新增應用傳輸層安全異常。
iOS 開發 Swift 2 - 整合地圖
地圖已成為每個人日常生活中的一部分。當我們前往某個地方或搜尋某個地方時,它們變得非常有用。
整合地圖並定位印度門
我們將在應用程式中製作地圖,這些地圖將顯示印度門在中心。我們將透過在專案中實現來學習地圖。因此,建立一個單檢視 iOS 應用程式,並將其命名為你想要的任何名稱。
新增地圖套件檢視
轉到物件庫並搜尋地圖套件檢視,點選拖動並將其帶到你的檢視中,將其拉伸以填充整個檢視。
新增約束
透過 control + drag 到檢視控制器 .swift 檔案為 mapViewKit 建立一個出口。它現在可能會顯示錯誤,但我們將處理它。在檔案的頂部,在 import UIKIT 下方,新增 import MapKit,這將消除錯誤。
之後,在 class ViewController: UIViewController 之後新增 MKMapViewDelegate。現在,檔案應如下所示 −
現在,我們將為我們的地圖建立緯度和經度、增量、跨度、位置和區域。在此之前,我們將告訴你如何獲取某個地方的緯度和經度。
轉到 maps.google.com 並搜尋某個位置。在頂部,我們將看到其緯度和經度在 URL 中。例如:讓我們搜尋印度門。
設定緯度和經度
獲取緯度和經度後,我們將為它們建立變數。
let latitude: CLLocationDegrees = 28.610 let longitude: CLLocationDegrees = 77.230
設定緯度和經度的增量
新增緯度和經度後,我們將為它們新增增量,它是可以驗證我們的緯度和經度的值。它們應保持最小,以便更精確地定位。
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 元素時,它們在一個裝置上可能看起來很完美。然而,現在我們應該在其他裝置上嘗試相同的應用程式。我們肯定會看到 UI 的巨大變化,並且某些元素也可能不會出現。
自動佈局是我們用來解決此問題的技術。在本章中,我們將瞭解如何製作自動佈局、應用約束和堆疊檢視,以使你的應用程式在每個裝置上看起來完美且最佳。
我們將從製作一個新的單檢視應用程式開始。
新增元素
在檢視的頂部中央新增一個標籤,並在檢視的底部右側新增一個標籤,如下所示 −
現在,嘗試更改方向,我們將看到右下角不會出現,而中心不在中心。
(提示 − 你不需要執行模擬器即可檢視佈局,只需點選“檢視為”− iPhone x,位於螢幕底部,如下面的螢幕截圖所示。)
選擇 iPhone 版本和方向。我們將看到 UI 元素排列不正確。因此,當我們更改方向、裝置或兩者時,右下角標籤將消失,並且中心將不在中心。
發生這種情況是因為我們沒有為元素指定固定位置。為了解決這個問題,我們將使用約束。
將約束應用於 UI 元素
點選中心標籤,按住 control 並拖動到檢視內的任何位置,釋放。現在你必須看到 −
選擇水平居中於容器。再次重複上述步驟並選擇“垂直間距到頂部佈局指南”。
現在,點選“新增新約束”按鈕並選擇高度和寬度,然後點選“新增 2 個約束”。
點選右下角標籤,從標籤 control 拖動到檢視內的任何位置,並選擇“尾隨空間到容器邊距”。類似地選擇“垂直間距到底部佈局指南”。
(提示 − 要一次選擇多個選項,請按住 shift 並選擇這些選項。確保在選擇所有內容之前不要釋放 shift。)
應用所有約束後,檢視應如下所示 −
堆疊檢視
堆疊檢視透過將元素排列成堆疊來工作。排列後,我們只需定義一次約束,所有元素就會相應地排列。要開始使用堆疊檢視,請建立以下檢視,該檢視在其他裝置上看起來不太好。但是,在本節中,我們將使其適合其他裝置。
現在,選擇頂部兩個按鈕 – 選擇一個按鈕,按住 command 然後選擇第二個按鈕。要將它們嵌入到堆疊檢視中,請轉到編輯器→嵌入→堆疊檢視。
或
在右下角,有一個選項
選擇此選項,這將使檢視嵌入到堆疊檢視中。
水平堆疊檢視
水平堆疊檢視將如下面的螢幕截圖所示。
在選擇此堆疊檢視時,轉到屬性檢查器。將“分佈”更改為“等分填充”,並將“間距”更改為 10。
現在,選擇此堆疊檢視和底部按鈕,然後再次嵌入到堆疊檢視中。這次堆疊檢視軸將是垂直的,而在前面的堆疊檢視中,它是水平的。
垂直堆疊檢視
現在你的檢視將如下所示 −
在選擇此堆疊檢視時,轉到其屬性檢查器,並確保它與下面的螢幕截圖匹配。
現在,你的檢視應如下所示 −
最後一步是為這個堆疊檢視建立約束。
選擇堆疊檢視→點選“新增新約束”按鈕。
這將在一個新視窗中開啟,在該視窗中,我們必須按照下一個螢幕截圖中顯示的步驟操作。
向堆疊檢視新增約束
以下螢幕截圖將說明如何向堆疊檢視新增約束。
這就是我們對自動佈局所做的全部操作。在下一章中,我們將討論動畫。
這就是我們對自動佈局所做的全部操作。在下一章中,我們將討論動畫。
使用 Swift 2 進行 iOS 開發 - 動畫
動畫是任何應用程式的重要組成部分,因為它會吸引使用者對應用程式的注意力。動畫只是以快速速度重複的一系列影像的集合。它還可以使你的應用程式與其他應用程式有所區別。
製作動畫專案 − 小貓動畫
這將是一個簡單的專案,其中我們將在點選按鈕時執行動畫。我們將使用多張影像來建立 GIF,因此請下載任何 GIF 並將其轉換為影像,這將為你提供該 GIF 的多個幀。
在本節中,我們將使用以下影像。
這些圖片組合在一起可以建立動畫。因此,我們將建立一個單檢視應用程式。然後,我們將一個影像檢視選項、一個標籤和一個按鈕拖到主檢視控制器中。完成後,我們將影像檢視和按鈕連線到我們的 Swift 檔案。
(如果您不想使用這些圖片,可以搜尋任何 GIF 並使用一些 GIF 到圖片轉換器將其線上轉換為圖片。)
在按鈕操作中,我們將插入以下命令,以便在按下按鈕時顯示影像。
imageView.image = UIImage(named: "frame_0_delay-0.1s.gif") // frame_0_delay-0.1s.gif, is the name of image
這就是我們以程式設計方式將影像分配給影像檢視的方式。現在檢視應該如下所示:
執行應用程式時,將顯示第一個檢視。當我們點選“動畫”按鈕時,影像將顯示。
這不是動畫,而只是一張圖片。我們現在將建立動畫:
在影像出口下方新增一個變數:var counter = 1。
請注意,我們的影像具有共同的名稱,並且只有一個字元不同。更改“動畫”按鈕的程式碼,如下所示:
@IBAction func animatePressed(_ sender: Any) {
imageView.image = UIImage(named: "frame_\(counter)_delay-0.1s.gif")
counter += 1
if counter == 9 {
counter = 0
}
}
現在,當您按下“動畫”按鈕時,影像每次都會更改。下一步是建立以下內容:
建立一個變數 - isAnimating 併為其分配 False。
建立一個計時器變數,併為其分配一個Timer()函式。
完成上述兩個步驟後,建立一個名為 animate 的函式,並貼上以下程式碼。
func animate() {
imageView.image = UIImage(named: "frame_\(counter)_delay-s.gif")
counter += 1
if counter == 9 {
counter = 0
}
}
其中,counter 是我們在前一個檔案中建立的計數器變數。現在,在 animate 按鈕函式中,新增以下程式碼:
if isAnimating {
timer.invalidate()
isAnimating = false
} else {
timer = Timer.scheduledTimer(timeInterval: 0.1, target: self, selector:
#selector(ViewController.animate), userInfo: nil, repeats: true)
isAnimating = true
}
嘗試執行應用程式,您將在裝置上看到動畫正在執行。
挑戰 - 新增一個停止按鈕,用於停止動畫。
訪問 Web 服務
在我們的應用程式中,我們可能需要連線到 API 並檢索來自該 API 的資料,並在我們的應用程式中使用。
首先,我們需要提供資料的 URL。
api.openweathermap.org/data/2.5/forecast?id=524901&APPID=1111111111
之後,我們需要新增傳輸層安全異常,以允許我們的應用程式與 Web 服務通訊(如果服務不是 https)。我們將在info.plist檔案中進行這些更改。
最後,我們將建立一個 URLSession 來建立網路請求。
let urlString = URL(string: "your URL") // Making the URL
if let url = urlString {
let task = URLSession.shared.dataTask(with: url) {
(data, response, error) in // Creating the URL Session.
if error != nil {
// Checking if error exist.
print(error)
} else {
if let usableData = data {
// Checking if data exist.
print(usableData)
// printing Data.
}
}
}
}
task.resume()
這就是您如何使用 URL 會話在應用程式中使用 Web 服務。
Alamofire
Alamofire 是一個用 Swift 編寫的 HTTP 網路庫。它可用於發出 URL 請求、釋出資料、接收資料、上傳檔案、資料、身份驗證、驗證等。
要安裝 Alamofire,您可以訪問 Alamofire 在 GitHub 上的官方頁面,並閱讀他們的安裝指南。
在 Alamofire 中發出請求
要在 Alamofire 中發出請求,我們應該使用以下命令。
Import Alamofire
Alamofire.request("url");
響應處理
以下命令用於響應處理。
Alamofire.request("url").responseJSON {
response in
print(response.request)
// original URL request
print(response.response)
// HTTP URL response
print(response.data)
// server data
print(response.result)
// result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
響應驗證
以下命令用於響應處理。
Alamofire.request("https://httpbin.org/get").validate().responseJSON {
response in
switch response.result {
case .success:
print("Validation Successful")
case .failure(let error):
print(error)
}
}
這些是使用 URL 會話和 Alamofire 發出 URL 請求的基礎知識。有關更高階的 Alamofire 內容,請訪問 Alamofire 文件,您可以在其中詳細瞭解它。
併發控制
併發是一種同時執行多個任務的方式。在應用程式中,併發指的是多個任務同時/併發執行。
併發可以使您的應用程式更快、更簡潔,併為使用者提供更好的體驗。許多開發人員認為使用多執行緒很困難,但NSOperation和Dispatch Queues之類的 API 使在應用程式中輕鬆使用併發和多執行緒成為可能。
Grand Central Dispatch
GCD 是最常用的 API,用於管理併發程式碼並在系統級別異步執行操作。GCD 提供並使用任務佇列。這些佇列是使用 FIFO 術語的資料結構,即佇列中第一個任務將首先執行,佇列中最後一個任務將最後執行。
例如 - 假設一個電影票預訂隊伍,如果您是最後一個人,您將最後獲得票,如果有人在您之後來,他將在您之後獲得票。
Dispatch Queue
Dispatch queue 是一種在應用程式中非同步和併發執行任務的簡單方法。佇列有兩種型別:
序列佇列 - 它們以序列方式儲存任務,並一次執行一個任務。
併發佇列 - 它們以序列方式儲存任務,並一次執行一個任務。
一些用於建立或獲取佇列的函式是:
dispatch_queue_create // create a serial or concurrent queue dispatch_queue_get_label // get the label of a given queue dispatch_get_main_queue // get the one and only main queue dispatch_get_global_queue // get one of the global concurrent queues
向佇列新增任務
有兩種型別的函式可以幫助將任務新增到佇列中。它們是:
同步函式 -
dispatch_once - 僅在應用程式生命週期結束後提交一次任務。
dispatch_sync - 將任務提交到佇列,並在任務完成後返回。
非同步函式 -
Dispatch_async - 將提交任務並返回。
Dispatch_after - 立即返回,但延遲特定時間。
Dispatch_async - 立即返回,但任務將提交多次。
示例程式碼
以下是將任務新增到佇列的示例程式碼。
dispatch_async(dispatch_get_main_queue(), update_block); // add update_block to main queue dispatch_apply(i, some_queue, work_block) // add work_block to some_queue i times dispatch_sync(background_queue, blocking_block) // add blocking block to background queue and wait for completion
使用佇列的一般示例
以下程式碼是使用佇列的示例。
dispatch_async(background_queue, ^ {
// Perform code that takes long time, here.
Dispatch_async(dispatch_get_main_queue(), ^ {
//Some other task, generally UI.
});
});
這就是我們將要進行的併發控制操作,因為在您成為中級 iOS 開發人員之前,這些資訊已經足夠了。
繼續練習您學到的概念,並嘗試根據您的需求修改和整合它們。