用Swift开发Mac App(5)
来源:互联网 发布:单相电机绕组数据大全 编辑:程序博客网 时间:2024/05/16 09:47
显示昆虫详情
打开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)
- 用Swift开发Mac App(1)
- 用Swift开发Mac App(2)
- 用Swift开发Mac App(3)
- 用Swift开发Mac App(4)
- 用Swift开发Mac App(6)
- 用Swift开发Mac App(7)
- 用Swift开发Mac App(8)
- MAC APP开发笔记
- 从零开始学Swift计时器App开发
- 16、使用swift语言开发iOS app
- 从零开始学Swift计时器App开发
- 从零开始学Swift计时器App开发
- Swift开发:修改app程序图标
- swift 开发环境安装导致mac无法开机的问题解决
- iso swift 开发学习地址---Mac
- Swift开发教程--mac os下如何保存纯文本文件
- iOS开发swift如何将字符串生成mac的md5
- 线程头文件<pthread.h>
- Fiber Communications (暴力)
- PHPCMS栏目页循环调用单页与文章列表
- disi使用
- ds cs探究
- 用Swift开发Mac App(5)
- Spring学习笔记(2)----------设计理念
- SQL应用与开发:(七)数据操作 · 查 · (三)使用子查询访问和修改数据
- Android视频播放项目总结之 使用第三方Vitamio库,开发万能播放器(二)
- 一些项目——二维数组的置换
- linux内核调试: eclipse + qemu 组合
- Java基础知识笔记
- Android视频播放项目总结之 使用第三方Vitamio库,开发万能播放器(三)
- python破解教程一 破解211高校BBS论坛的用户密码