用Swift开发Mac App(5)

用Swift开发Mac App(5),第1张

概述显示昆虫详情 打开MasterViewController.swift 增加如下方法: func selectedBugDoc() -> ScaryBugDoc? {    let selectedRow = self.bugsTableView.selectedRow;    if selectedRow >= 0 && selectedRow < self.bugs.count { retur

显示昆虫详情

打开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代码。然后选择加号按钮,右键拖一条线到这个扩展上。


在d出的窗口中,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)全部内容,希望文章能够帮你解决用Swift开发Mac App(5)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1088020.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存