當您發現錯誤而且必須使用它修復全部應用程序時,複製和粘貼代碼會很糟糕。但有沒有辦法避免呢? 就在這裏! Apple提供了一種稱爲框架的工具來簡化代碼共享。此外,它還爲咱們提供了一種機制,能夠對相關代碼進行分組(模塊化)並限制對代碼的訪問(封裝)。 在本文中,咱們將介紹框架是什麼以及使用它們的緣由。我將按照一步一步的指導如何建立和構建框架,最後如何在應用程序中使用框架。框架中的代碼將專門用於本文的Swift編寫。 ##什麼是框架 框架是一個結構化目錄,能夠包含共享代碼和共享資源,如圖像,nib文件(xib和故事板的編譯形式)和其餘資產。您能夠將其視爲提供代碼和/或其餘可重用資產的包,以使您的代碼正常工做。 ##爲何使用框架 咱們已經介紹了使用框架的主要緣由。另外一個很好的理由是簡化與組織服務的集成。 例如,Paypal提供框架來幫助應用程序處理信用卡交易。 Onfido提供了進行遠程身份驗證的框架。 框架能夠節省您的客戶與您的服務的集成工做。爲客戶節省時間和金錢。更快的客戶能夠在您開始賺錢以前消費您的服務。 此外,在選擇提供者時,時間和精力多是前景的關鍵因素。事實上,價值超過92億美圓的Stripe開始出於對支付處理器的整合挫敗感。 ##如何構建一個框架 在本節中,咱們將指導您完成建立和構建框架的過程。該框架將包含一個簡單的登陸屏幕。 在接下來的步驟中,咱們將:編程
單擊對象庫。出現搜索欄時,搜索標籤,而後將標籤拖放到空白畫布上。 swift
首先打開LoginViewController.xib,而後打開助手編輯器,它是Xcode UI右上角的兩個相交循環圖標。 而後逐個選擇文本字段並按住Control鍵並將視圖拖放到視圖控制器上。這將打開一個彈出窗口,容許咱們配置XIB和視圖控制器之間的鏈接。如今將文本字段的鏈接設置爲Outlet,將名稱設置爲與每一個文本字段相關的內容,例如emailTextField,類型爲UITextField,以及從最後一個選擇弱選項。重複密碼文本字段的步驟。 如今拖放登陸按鈕,但在這種狀況下,選擇Action for connection,將其命名爲signIn,而後從類型下拉列表下方的下拉列表中選擇Touch Up Inside。這有點不一樣,咱們正在對視圖而不是視圖自己進行操做,在此咱們指定一個函數來響應登陸按鈕上的點擊。xcode
如今咱們將打印用戶名和密碼到控制檯。在登陸功能中添加如下行: print("username \(emailTextField.text) password \(passwordTextField.text)")
咱們如今擁有了讓用戶登陸所需的一切。咱們不會在這裏介紹身份驗證,代碼是演示訪問框架代碼和資源的應用程序。咱們將以編程方式加載視圖控制器,但在咱們完成以前,咱們的視圖控制器必須知道要加載哪一個XIB。 ###5. 以編程方式加載視圖控制器 咱們的XIB包含咱們的視圖聲明以及它們的結構,配置和連接方式。 XIB有一個關於誰與之連接以及如何連接的概念,可是咱們的視圖控制器不知道咱們的XIB,所以當咱們實例化視圖控制器時,就像如今同樣,咱們的視圖控制器上的視圖和連接將不會被建立。咱們必須告訴咱們的視圖控制器在實例化時從哪裏讀取它的視圖。爲咱們的視圖控制器添加如下自定義初始化函數,該函數從咱們的xib讀取:app
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 { ... }
如今咱們能夠從使用框架的應用程序初始化咱們的視圖控制器。編輯器
這就是咱們須要作的就是展現如何以標準化框架格式向其餘開發人員共享代碼和資源。 ##使用框架 在本節中,咱們將經過咱們如今將建立的應用程序來使用咱們在上一節中構建的框架。若是您跳過上一節,能夠在此處找到框架項目源代碼。 咱們將:ide
}
複製代碼
在登陸功能中,咱們但願從框架中顯示登陸屏幕。 ###3. 在按鈕點擊時展現框架中的登錄屏幕 此時咱們已經建立了一個新項目,爲自動建立的視圖控制器添加了一個按鈕,並將按鈕點擊鏈接到ViewController類中的一個函數。咱們但願在用戶點擊登陸按鈕時從咱們以前建立的框架中顯示登陸屏幕。但在咱們作到這一點以前,咱們首先必須將框架連接到咱們的應用程序。咱們能夠經過各類方式訪問框架,但在本文中,咱們將使用Xcode工做區來執行此操做。在工做區中,您能夠添加多個項目並將它們連接在一塊兒,就像在單個項目下同樣。 要建立工做區,請選擇「文件」>「新建」>「工做區...」,並將其命名爲MyApp。將其保存在與應用程序和框架項目相同的目錄中。 工做區最初將爲空,所以咱們將兩個項目添加到工做區。從菜單欄中選擇File> Add Files to「MyApp」...並添加分別位於名爲MyApp和MyFramework的目錄下的MyApp.xcodeproj和MyFramework.xcodeproj。確保其餘XCode窗口中沒有打開這些項目,不然它們不會顯示其內容。 接下來選擇MyApp項目文件(項目導航器中的藍色文檔圖標,位於右側窗格的第一個選項卡下)。而後在「常規」選項卡下的「項目設置」窗口中,在「嵌入式二進制文件」部分下單擊+按鈕。將出現一個新窗口,其中包含工做區中的全部選項。選擇MyFramework.framework,而後單擊「添加」。模塊化
present(LoginViewController(), animated: true, completion: nil)
當用戶點擊應用程序中的登陸按鈕時,此行將顯示框架中的登陸屏幕。
就這樣!如今您能夠運行該應用程序並自行查看它! ##總結 到如今爲止你應該知道:函數