如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(3)

來源:互聯網
上載者:User

標籤:應用   parse   

【編者按】本篇文章作者是 Reinder de Vries,既是一名企業家,也是優秀的程式員,發表多篇應用程式的部落格。本篇文章中,作者主要介紹了如何基於 Parse 特點,打造一款類似 Instagram 的應用,完整而清晰的步驟,為開發人員提供一次絕佳的學習體驗。本文系 OneAPM 工程師編譯整理,這是本系列的第 3 篇文章。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(1)

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(2)

使用 Swift 和自訂表格視圖儲存格

現在讓我們再次迴歸代碼——已經有足夠的介面。開啟 CatsTableViewController.swift 並找到指定初始化 init(風格:類名:)。

在這個方法中,我們可以在 self.parseClassName = className;下添加以下兩行代碼:

self.tableView.rowHeight = 350self.tableView.allowsSelection = false

第一行設定合適的行高,第二行禁止儲存格選擇。
然後添加下列代碼到 viewDidLoad just above super.viewDidLoad(): 方法

tableView.registerNib(UINib(nibName: "CatsTableViewCell", bundle: nil), forCellReuseIdentifier: cellIdentifier)

該行很可能引發錯誤。為了盡量不出錯,將下面代碼從 tableView 的 cellForRowAtIndexPat 方法移動到類的頂部,並重新將其值命名為「CatCell」。

let cellIdentifier:String = "Cell"

類的定義應該類似這樣:

 class CatsTableViewController: PFQueryTableViewController  {    let cellIdentifier:String = "CatCell"    override init!(style: UITableViewStyle, className: String!)}

我們剛剛將 cellIdentifier 常量從局部方法範圍擴充成類範圍,使得它在整個類中均可用,包括 tableView 的 cellForRowAtIndexPath 和 viewDidLoad。
接下來,我們用下面代碼替換 tableView 的 cellForRowAtIndexPath 的內容:

var cell:CatsTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CatsTableViewCellif(cell == nil) {    cell = NSBundle.mainBundle().loadNibNamed("CatsTableViewCell", owner: self, options: nil)[0] as? CatsTableViewCell}if let pfObject = object {    cell?.catNameLabel?.text = pfObject["name"] as? String    var votes:Int? = pfObject["votes"] as? Int    if votes == nil {        votes = 0    }    cell?.catVotesLabel?.text = "\(votes!) votes"    var credit:String? = pfObject["cc_by"] as? String    if credit != nil {        cell?.catCreditLabel?.text = "\(credit!) / CC 2.0"    }}return cell

你不禁疑惑,這與我們以前使用的舊代碼相比有什麼區別?主要體現在:

  1. 儲存格類型從 PFTableViewCell 改為 CatsTableViewCell
  2. 當儲存格為空白,新儲存格從我們剛才建立的 XIB 檔案中得到。我們將從集合中檢索,賦予所有當前類所有權,然後將它轉換為 catstableviewcell。
  3. 然後,我們檢查對象是否存在,並嘗試將 Parse 對象的列名賦給它的文字屬性,就像之前那樣。
  4. 然後,catVotesLabel 和文字屬性也一樣。Parse 每列的票數是 String 類型,但不是 int,所以要轉換成 int 類型嗎?如果票數恰好是空值,那麼我們就將其設定為零。然後,使用一種稱為字串插值的騷亮技術,設定標籤文本。

最後,我們返回儲存格。

讓我們再次運行應用程式。一切看上去太完美了!沒有 Bug 和死機!但是…映像在哪兒?

從 Parse 非同步下載映像

映像不見了,這怎麼可以!讓我們加上它。在 TableView 的 cellForRowAtIndexPath 添加如下代碼「在最後一個 if 語句(用於信用標籤)之後,在返回語句之前」。

var cell:CatsTableViewCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as? CatsTableViewCellif(cell == nil) {    cell = NSBundle.mainBundle().loadNibNamed("CatsTableViewCell", owner: self, options: nil)[0] as? CatsTableViewCell}if let pfObject = object {    cell?.catNameLabel?.text = pfObject["name"] as? String    var votes:Int? = pfObject["votes"] as? Int    if votes == nil {        votes = 0    }    cell?.catVotesLabel?.text = "\(votes!) votes"    var credit:String? = pfObject["cc_by"] as? String    if credit != nil {        cell?.catCreditLabel?.text = "\(credit!) / CC 2.0"    }}return cell

哇!這裡發生了什嗎?我們將 Parse 的 URL 列轉成了 NSURL 類型的執行個體。

我們用它在主操作隊列中啟動非同步 NSURLConnection,其中下載映像作為 NSData 對象。當下載完成時關閉執行。它分配下載得到 UIImage 的資料,分配到 catImageView 的映像屬性中。

在這裡無需鑽研太深,因為上面代碼的複雜性與我們的應用程式無關。但是,請注意以下幾點:

  • 使用 NSURLConnection 很方便,但有點枯燥。當你使用互連網上的資料來源做更複雜的事情,請選擇優秀的 AFNetworking (Objective-C)或 alamofire (Swift)庫。
  • Parse 允許你將映像儲存在雲端,並能直接使用。它是 ParseUI 的組成部分,但它不允許外部 URL(貓圖片源自 Flickr)的調用。
  • 在開始另一個非同步串連之前,我們首先要明確主隊列中的所有操作。這是有點枯燥:它從隊列中移除 pending-and-unfinished 下載。嘗試刪除該行並運行程式,你會看到所有映像混合成一堆。當它重新使用儲存格時,出列機制不會重設任何掛起串連,因此映像可以載入成功。

讓我們再運行應用,看看是否有效。

加碼 : Instagram 的類似功能

進行到這一步了,真不容易!還有一些終極功能有待完善。接下來就讓我們來添加這些功能:類似「Instagram」的功能——你在圖片上雙擊,一個「贊+1」被添加到該貓的圖片上,並顯示一個乾淨的小貓爪動畫。

首先,為爪子映像到表視圖儲存格添加出口。添加下面一行代碼到 CatsTableViewCell 類(在其他四個出口的下面):

@IBOutlet weak var catPawIcon:UIImageView?

在 Interface Builder 中添加一個 UIImageView 到 CatsTableViewCell.xib。還記得怎麼做的嗎?

  1. 在物件程式庫中尋找 UIImageView 類。
  2. 將它從物件程式庫中拖放到表視圖儲存格。

確保將其向右拖動到其他映像視圖的中心。調整新映像,寬高均為 100 點,它的 X 和 Y 均為大約110點。然後,當映像視圖已選中時,添加以下限制。

  1. Editor → Pin → Width
  2. Editor → Pin → Height
  3. Editor → Pin → Top Space To Superview
  4. Editor → Align → Horizontal Center In Container

正如所示,使映像視圖水平置中,固定寬度和高度為100點,並保持它與頂部有固定的空間,有效地將其置中的貓映像的放在正中心。

現在,通過從文檔的頂部選擇貓的表格視圖儲存格,建立出口串連。再選擇 Connections Inspector 選項卡,從 catpawicon 儲存格映像視圖中繪出一條藍色的線。

接下來,下載 paw.zip。該檔案包含三個圖形檔案,是一個映像的三種解析度。在使用之前需要將它們匯入。

首先,解壓縮檔案;然後,開啟 Xcode 中 Images.xcassets 檔案;接著按右鍵左側列表(一個寫著 APPICON 的列表),然後單擊建立映像集,或使用左下方的「加號」按鈕。重新命名剛才建立的映像集,開啟其屬性。

現在,將剛才解壓的檔案從 Finder 拖至開啟的檔案集。確保檔案匹配:

  • paw.png 是 1x.
  • [email protected] 是 2x.
  • [email protected] 是 3x.

看不到檔案也不用擔心,因為它們都是白色。

然後,返回 CatsTableViewCell.xib 並選擇小映像視圖。找到屬性偵測器,然後從在映像下拉式清單中選擇合適的爪子映像。白色的爪子應該像這樣顯示在儲存格視圖。

最後,請記住串連與 catPawIcon 出口和小映像視圖。
現在,讓我們回到編碼。開啟 Xcode 中的 CatsTableViewCell。將下面的代碼添加到 awakeFromNib 方法中(在super.awakeFromNib() 之前)。

let gesture = UITapGestureRecognizer(target: self, action:Selector("onDoubleTap:"))gesture.numberOfTapsRequired = 2contentView.addGestureRecognizer(gesture)catPawIcon?.hidden = true

這裡會發生兩種情況。

  • 第一,我們建立一個 UITapGestureRecognizer,這樣我們便可以跟任何視圖互動。在這種情況下,我們將其添加到 contentView 查看,這個視圖包括儲存格的兩個標籤和兩個映像視圖。它為 onDoubleTap: 初始化一個 target、self、一個動作和一個選取器。所以,當檢測到連續雙擊時,方法 onDoubleTap:of self(當前類)被執行。此外,我們設定連續數目為 2,使得它為雙擊響應。

  • 第二,我們隱藏 catPawIcon 出口。

其次,添加 onDoubleTap 方法到當前類(在 awakeFromNib():函數之後)。

func onDoubleTap(sender:AnyObject) {    catPawIcon?.hidden = false    catPawIcon?.alpha = 1.0    UIView.animateWithDuration(1.0, delay: 1.0, options:nil, animations: {        self.catPawIcon?.alpha = 0        }, completion: {            (value:Bool) in            self.catPawIcon?.hidden = true    })}

這種方法被稱為一個動作,始終需要一個參數:AnyObject。在該方法中,可以實現以下動畫代碼:

  1. 首先,通過設定隱藏為 false,使 catPawIcon 可見。
  2. 然後,將 alpha 即透明度設定為1.0,完全可見。需要重設映像狀態,也就是當動畫完成時 Alpha 色板為0。
  3. 動畫的設定需要編程。UIView 的類方法被使用,這需要五個參數:動畫時間、動畫前延遲、基本選項、動畫屬性的關閉,以及動畫完成時關閉的指令。

這時你會看到:

  1. 為了使映像可見,我們可以設定它的 Alpha 色板為可見。
  2. 稍等一下動畫延遲。
  3. 動畫 Alpha 色板從1到0的時間不到一秒,這就是動畫周期。
  4. 動畫完成,隱藏映像。

這個解決方案的最大好處在於它便於使用:代碼將完全管理動畫。我們只需要設定它的初始狀態、結束狀態、期間,以及動畫架構插補狀態和動畫步驟。從技術上來講,我們使用兩個屬性:一個連續的值 α,一個用來隱藏管理爪子映像可見度的布爾值。

最後,運行應用,看看新功能能否正常適用。你可以雙擊一個儲存格,簡要展示爪子表徵圖,雙擊然後淡出消失。

能運行了嗎?太棒了!

用 Parse 整合投票

剩下要做的事就是給 Parse 貓對象增加投票數列,通過雙擊響應投票動作。

那麼我們怎麼去實現呢?

首先,我們要改變的對象叫做 PFObject 類型的對象,在 CatsTableViewController 的 tableView 的 cellForRowAtIndexPath 方法中。我們不能從表視圖單元訪問它,因為它在雙擊動作的方法內。

我們不能移動 onDoubleTap 方法,所以我們需要在表視圖對象和表視圖單元之間創造引用。

我們採取以下步驟來實現:

1.在 CatsTableViewCell 中,在類的頂部和網點下,編寫下列代碼建立一個新的屬性:

var parseObject:PFObject?

2.然後,在 tableView 裡的 cellForRowAtIndexPath,編寫下面代碼(就在儲存格 == nill 語句結束的大括弧後面),如下:

cell?.parseObject = object

現在,我們已建立一個機制,將 cellForRowAtIndexPath 的對象複製到我們的表視圖單元,使得在 CatsTableViewCell 類的對象執行個體可用。
然後,調整 CatsTableViewCell的onDoubleTap 方法。在該方法的開始處添加下面代碼:

if(parseObject != nil) {    if var votes:Int? = parseObject!.objectForKey("votes") as? Int {        votes!++        parseObject!.setObject(votes!, forKey: "votes");        parseObject!.saveInBackground();        catVotesLabel?.text = "\(votes!) votes";    }}

這段代碼可以實現以下工作:

  1. 檢查 parseObject 是否為空白;
  2. 從 parseObject 得到票數,並將它放在可選的 Int 中;
  3. 如果票數不為空白,用 ++ 操作增加票數變數,與 votes = votes! + 1 有相同功能;
  4. 用 setObject 函數將票數變數返回給 parseObject 集;
  5. 調用 parseObject 的 saveInBackground() 方法!它在後台將儲存當前對象,可能的時候將其寫入 Parse 雲端;
  6. 更新文本以反饋新的票數,一切就是這麼簡單,用 Command-R 或 Play 按鈕運行程式,驗證新功能是否實現。

運行成功了嗎?太贊了!

小結:

通過本篇文章,我們學習了以下內容:

  • 用 Parse 實現檢索,儲存資料到雲端;
  • Cocoapods整合一個調用 Objective-C 架構的 Swfit 程式;
  • 建立視圖和有介面的自訂表格視圖單元;
  • 從零開始,用 Swift 編寫一個完整的 App;
  • 使用自動布局和約束;
  • 使用手勢識別、可選類型、條件、閉包、屬性、出口和動作。

你可以在這裡下載整個爪子專案檔。使用 Xcode6.3(或以上)版本運行項目。請注意,你必須改變 AppDelegate.swift 中的應用程式鍵和用戶端密鑰。另外也要記住,如果你自己動手編寫這個完整的 App,對自己是個很好的提升機會。(完結)

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(1)

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(2)

原文地址:http://www.appcoda.com/instagram-app-parse-swift/

本文系 OneAPM 工程師編譯整理。OneAPM 是應用效能管理領域的新興領軍企業,能協助企業使用者和開發人員輕鬆實現:緩慢的程式碼和 SQL 陳述式的即時抓取。想閱讀更多技術文章,請訪問 OneAPM 官方部落格。

如何用 Parse 和 Swift 搭建一個像 Instagram 那樣的應用?(3)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.