用Swift開發Mac App(5)

來源:互聯網
上載者:User

標籤:

顯示昆蟲詳情

開啟MasterViewController.swift 增加如下方法:

func selectedBugDoc() -> ScaryBugDoc? {

   let selectedRow = self.bugsTableView.selectedRow;

   if selectedRow >= 0 && selectedRow < self.bugs.count {

return self.bugs[selectedRow]

   }  

   return nil

}

這個方法根據使用者選中的行索引,從資料模型中檢索響應的對象。

然後是這個方法:

func updateDetailInfo(doc: ScaryBugDoc?) {

   var title = ""

   var image: NSImage?

   var rating = 0.0  

   if let scaryBugDoc = doc {

     title = scaryBugDoc.data.title

     image = scaryBugDoc.fullImage

     rating = scaryBugDoc.data.rating

   }  

   self.bugTitleView.stringValue = title

   self.bugImageView.image = image

   self.bugRating.rating = Float(rating)

}

這個方法根據ScaryBugDoc對象,將昆蟲的資訊和圖片在UI上顯示。然後是這個方法:

func tableViewSelectionDidChange(notification: NSNotification!) {

   let selectedDoc = selectedBugDoc()

   updateDetailInfo(selectedDoc)        

}

當使用者改變了在表格中的選擇時,這個方法調用前兩個實用方法。

從OS X 10.10 Yosemite開始,View Controller 使用了新的

viewWillAppearviewDidLoad,以及其它iOS風格的生命週期方法。而在OS X中傳統的建立視圖方法一般是 loadView(), 這個方法是向後相容的,因此我們使用這個方法:

override func loadView() {

   super.loadView()  

   self.bugRating.starImage = NSImage(named: "star.png")

   self.bugRating.starHighlightedImage = NSImage(named: "shockedface2_full.png")

   self.bugRating.starImage = NSImage(named: "shockedface2_empty.png")  

   self.bugRating.delegate = self  

   self.bugRating.maxRating = 5

   self.bugRating.horizontalMargin = 12

   self.bugRating.editable = true

   self.bugRating.displayMode = UInt(EDStarRatingDisplayFull)  

   self.bugRating.rating = Float(0.0)

}

在這裡,我們初始化EDStarRating控制項:用於表示昆蟲驚悚指數的圖片,控制項的delegate屬性以及其它參數。

然後在MasterViewController.swift 最後增加一個extension聲明:

// MARK: - EDStarRatingProtocol  

extension MasterViewController: EDStarRatingProtocol {   }

等下在來實現這個EDStarRatingProtocol 協議。

先編譯運行程式,效果如下:


添加、刪除

開啟MasterViewController.xib ,拖兩個“Gradient Button” 到 table view下。 選擇其中一個按鈕, 開啟 Attributes 面板,刪除Title屬性中的內容,然後在Image屬性選擇,這將使按鈕顯示為一個“+”號。

同樣,將另一個按鈕設定為“-”號按鈕(Image屬性選擇為 “NSRemoveTemplate”)。


開啟Assistant Editor 視窗,確保當前內容為MasterViewController.swift檔案,首先添加一個擴充的定義:

// MARK: - IBActions  

extension MasterViewController {   }

嚴格來說這個擴充並非必須,但通過這種方式,我們能更好地組織我們的Swift代碼。然後選擇加號按鈕,右鍵拖一條線到這個擴充上。


在彈出的視窗中,Connection一欄選擇Action,Name一欄輸入 addBug, 然後點擊Connect.


這樣將建立一個 addBug(_:) 方法,每當加號按鈕被點擊,系統將調用這個方法。在減號按鈕上重複同樣步驟, Name請使用 deleteBug.

開啟 MasterViewController.swift實現addBug方法如下:

// 1. 使用預設值建立一個新的ScaryBugDoc執行個體

let newDoc = ScaryBugDoc(title: "New Bug", rating: 0.0, thumbImage: nil, fullImage: nil)  

// 2. 將該執行個體添加到model 數組

self.bugs.append(newDoc)

let newRowIndex = self.bugs.count - 1  

// 3.向table view插入新行

self.bugsTableView.insertRowsAtIndexes(NSIndexSet(index: newRowIndex), withAnimation: NSTableViewAnimationOptions.EffectGap)  

// 4. 選中並滾動到新行

self.bugsTableView.selectRowIndexes(NSIndexSet(index: newRowIndex), byExtendingSelection:false)

self.bugsTableView.scrollRowToVisible(newRowIndex)

實現deleteBug()方法如下:

// 1. Get selected doc

if let selectedDoc = selectedBugDoc() {

   // 2. Remove the bug from the model

   self.bugs.removeAtIndex(self.bugsTableView.selectedRow)

   // 3. Remove the selected row from the table view 

   self.bugsTableView.removeRowsAtIndexes(

NSIndexSet(index:self.bugsTableView.selectedRow),

withAnimation: NSTableViewAnimationOptions.SlideRight)  

   // 4. Clear detail info  

   updateDetailInfo(nil)

}


編輯

開啟 MasterViewController.xib, 開啟 Assistant Editor, 確保當前顯示的檔案是 MasterViewController.swift

選中text field, 右鍵拖到 MasterViewController.swift 檔案中的addBug()方法之前:


這將允許你為Text Field建立一個IBAction,Name 請使用bugTitleDidEndEdit


這個方法將在text field結束編輯時調用(當使用者按下斷行符號鍵或者離開Text Field控制項)。

回到MasterViewController.swift, 添加方法:

func reloadSelectedBugRow() {

   let indexSet = NSIndexSet(index: self.bugsTableView.selectedRow)

   let columnSet = NSIndexSet(index: 0)

   self.bugsTableView.reloadDataForRowIndexes(indexSet, columnIndexes: columnSet)

}

在這個方法中,我們重新載入該行資料模型,你需要在模型資料被改動後調用這個方法。

bugTitleDidEndEdit 方法實現如下:

if let selectedDoc = selectedBugDoc() {

   selectedDoc.data.title = self.bugTitleView.stringValue

   reloadSelectedBugRow()

}

首先,調用selectedBugDoc()獲得相關昆蟲的資訊,然後從text field讀取文本字串,並用它來更新模型中的昆蟲名稱。最後調用reloadSelectedBugRow()通知儲存格進行重新整理。

注意: 通知table view自己重新整理cell要比直接操縱cell的內容要好。

運行App,從列表選中某個昆蟲,嘗試修改其名稱(記得按斷行符號鍵),表格中的昆蟲名將隨之改變!

但是如果你切換到其他昆蟲,然後返回修改的那一個昆蟲,你會探索資料又回到原來(未改動前)了。這是因為我們沒有將模型對象進行持久化(儲存進檔案)。



用Swift開發Mac App(5)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.