顯示昆蟲詳情
打開MasterViewController.swift 增加以下方法:
func selectedBugDoc() -> ScaryBugDoc? { let selectedRow = self.bugsTableView.selectedRow; if selectedRow >= 0 && selectedRow < self.bugs.count { return self.bugs[selectedRow] } return nil } 這個方法根據(jù)用戶選中的行索引,從數(shù)據(jù)模型中檢索響應的對象。 |
然后是這個方法:
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) } |
這個方法根據(jù)ScaryBugDoc對象,將昆蟲的信息和圖片在UI上顯示。然后是這個方法:
func tableViewSelectionDidChange(notification: NSNotification!) { let selectedDoc = selectedBugDoc() updateDetailInfo(selectedDoc) } |
當用戶改變了在表格中的選擇時,這個方法調用前兩個實用方法。
從OS X 10.10 Yosemite開始,View Controller 使用了新的
viewWillAppear, viewDidLoad,和其它iOS風格的生命周期方法。而在OS X中傳統(tǒng)的創(chuàng)建視圖方法1般是 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控件:用于表示昆蟲驚悚指數(shù)的圖片,控件的delegate屬性和其它參數(shù)。
然后在MasterViewController.swift 最后增加1個extension聲明:
// MARK: - EDStarRatingProtocol extension MasterViewController: EDStarRatingProtocol { } |
等下在來實現(xiàn)這個EDStarRatingProtocol 協(xié)議。
先編譯運行程序,效果以下:
添加、刪除
打開MasterViewController.xib ,拖兩個“Gradient Button” 到 table view下。 選擇其中1個按鈕, 打開 Attributes 面板,刪除Title屬性中的內容,然后在Image屬性選擇,這將使按鈕顯示為1個“+”號。
一樣,將另外一個按鈕設置為“-”號按鈕(Image屬性選擇為 “NSRemoveTemplate”)。
打開Assistant Editor 窗口,確保當前內容為MasterViewController.swift文件,首先添加1個擴大的定義:
// MARK: - IBActions extension MasterViewController { } |
嚴格來講這個擴大并不是必須,但通過這類方式,我們能更好地組織我們的Swift代碼。然后選擇加號按鈕,右鍵拖1條線到這個擴大上。
在彈出的窗口中,Connection1欄選擇Action,Name1欄輸入 addBug, 然后點擊Connect.
這樣將創(chuàng)建1個 addBug(_:) 方法,每當加號按鈕被點擊,系統(tǒng)將調用這個方法。在減號按鈕上重復一樣步驟, Name請使用 deleteBug.
打開 MasterViewController.swift實現(xiàn)addBug方法以下:
// 1. 使用默許值創(chuàng)建1個新的ScaryBugDoc實例 let newDoc = ScaryBugDoc(title: "New Bug", rating: 0.0, thumbImage: nil, fullImage: nil) // 2. 將該實例添加到model 數(shù)組 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) |
實現(xiàn)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創(chuàng)建1個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) } |
在這個方法中,我們重新加載該行數(shù)據(jù)模型,你需要在模型數(shù)據(jù)被改動后調用這個方法。
bugTitleDidEndEdit 方法實現(xiàn)以下:
if let selectedDoc = selectedBugDoc() { selectedDoc.data.title = self.bugTitleView.stringValue reloadSelectedBugRow() } |
首先,調用selectedBugDoc()取得相干昆蟲的信息,然后從text field讀取文本字符串,并用它來更新模型中的昆蟲名稱。最后調用reloadSelectedBugRow()通知單元格進行刷新。
注意: 通知table view自己刷新cell要比直接操縱cell的內容要好。
運行App,從列表選中某個昆蟲,嘗試修改其名稱(記得按回車鍵),表格中的昆蟲名將隨之改變!
但是如果你切換到其他昆蟲,然后返回修改的那1個昆蟲,你會發(fā)現(xiàn)數(shù)據(jù)又回到原來(未改動前)了。這是由于我們未將模型對象進行持久化(保存進文件)。
上一篇 3、軟件管理(卸載、啟動、分享)