程序员人生 网站导航

用Swift开发Mac App(5)

栏目:综合技术时间:2015-08-03 08:51:53

显示昆虫详情

打开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中传统的创建视图方法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控件:用于表示昆虫惊悚指数的图片,控件的delegate属性和其它参数。

然后在MasterViewController.swift 最后增加1个extension声明:

// MARK: - EDStarRatingProtocol  

extension MasterViewController: EDStarRatingProtocol {   }

等下在来实现这个EDStarRatingProtocol 协议。

先编译运行程序,效果以下:


添加删除

打开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.


这样将创建1个 addBug(_:) 方法,每当加号按钮被点击,系统将调用这个方法。在减号按钮上重复一样步骤, Name请使用 deleteBug.

打开 MasterViewController.swift实现addBug方法以下:

// 1. 使用默许值创建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创建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)

}

在这个方法中,我们重新加载该行数据模型,你需要在模型数据被改动后调用这个方法。

bugTitleDidEndEdit 方法实现以下:

if let selectedDoc = selectedBugDoc() {

   selectedDoc.data.title = self.bugTitleView.stringValue

   reloadSelectedBugRow()

}

首先,调用selectedBugDoc()取得相干昆虫的信息,然后从text field读取文本字符串,并用它来更新模型中的昆虫名称。最后调用reloadSelectedBugRow()通知单元格进行刷新。

注意: 通知table view自己刷新cell要比直接操纵cell的内容要好。

运行App,从列表选中某个昆虫,尝试修改其名称(记得按回车键),表格中的昆虫名将随之改变!

但是如果你切换到其他昆虫,然后返回修改的那1个昆虫,你会发现数据又回到原来(未改动前)了。这是由于我们未将模型对象进行持久化(保存进文件)。



------分隔线----------------------------
------分隔线----------------------------

最新技术推荐