標籤:
顯示昆蟲詳情
開啟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 使用了新的
viewWillAppear, viewDidLoad,以及其它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)