
关于用户体验方面,我们仍然有一些细节值得注意。例如:运行App,不要选择任何昆虫,点击“Delete” 或者 “Change Picture” 按钮,什么都不会发生,Why?
作为程序员,你当然知道当用户什么都没选择的情况下,不应当执行任何 *** 作,但对于用户而言,这种情况仍然显得不太友好:
我们通过以下方式来解决这个问题:
·如果用户选中了某个单元格,我们才让Delete按钮、Change picture按钮、文本框和rating vIEw可用。
·如果用户未选择任何行,我们禁用上述控件,用户将不能和它们进行任何交互。
打开MasterVIEwController.xib,选择Delete按钮,在属性面板,将Enabled属性前的勾去掉。
在ChangePicture 按钮、text fIEld上重复上述步骤。
这样,当程序刚启动时,上述控件将被禁用。然后我们需要在用户选择了表格中的单元格之后再启用它们。要实现这个目的,我们首先需要为它们创建IBOutlet。
打开AssistantEditor 确保当前编辑的文件为MasterVIEwController.swift。
选择“Delete” 按钮,右键将它拖动到MasterVIEwController.swift文件中。
在d出的出口中,选择connection为“Outlet”,name 栏输入deletebutton,然后点击Connect.
重复上述步骤,为Changepicture按钮创建一个IBOutlet,名为changePicturebutton.
打开MasterVIEwController.swift,在tableVIEwSelectionDIDChange(_:),加入以下代码,位于updateDetailinfo(selectedDoc)一行以后:
// Enable/disable buttons based on the selection let buttonsEnabled = (selectedDoc != nil) deletebutton.enabled = buttonsEnabled changePicturebutton.enabled = buttonsEnabled BUGrating.editable = buttonsEnabled BUGTitleVIEw.enabled = buttonsEnabled |
我们首先判断控件是否需要被启用,这是通过用户是否选中单元格来决定的。如果selectedDoc为空,则意味着没有行被选中,这说明控件应当被禁用,否则启用控件。
此外,ratingvIEw 默认是启用的,所以我们还需要在
loadVIEw()中禁用它。找到这行语句:
self.BUGrating.editable = true |
修改为
self.BUGrating.editable = false |
运行程序。
注意:你还可以在用户未选择有效行时讲整个细节页面都隐藏起来,但这完全取决于你。
保存数据就像iOS,Mac App也能够使用NSUserDefaults,因此我们完全可以把数据存放到那里。
首先我们必须让模型类实现NSCoding协议。在ScaryBUGData.swift中定义一个扩展:
// MARK: - NSCoding extension ScaryBUGData: NSCoding { func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.Title,forKey: "Title") coder.encodeObject(Double(self.rating),forKey: "rating") } } |
首先我们让ScaryBUGData实现NSCoding协议中的encodeWithCoder方法。这个方法用于对自定义类进行编码。
同时还需要一个与之对应的初始化方法。不同的是,我们无法在扩展中定义required的init方法,因此必须把它定义在类代码中:
required convenIEnce init(coder decoder: NSCoder) { self.init()
self.Title = decoder.decodeObjectForKey("Title") as String self.rating = decoder.decodeObjectForKey("rating") as Double }
init(coder:)方法和encodeWithCoder方法向反,用于从文件中读取数据并反编码为对象。
然后在ScaryBUGDoc.swift中定义一个扩展实现NSCoding协议:
// MARK: - NSCoding extension ScaryBUGDoc: NSCoding { func encodeWithCoder(coder: NSCoder) { coder.encodeObject(self.data,forKey: "data") coder.encodeObject(self.thumbImage,forKey: "thumbImage") coder.encodeObject(self.fullimage,forKey: "fullimage") } } |
然后在类代码中(不要在扩展定义中)定义Init方法:
required convenIEnce init(coder decoder: NSCoder) { self.init() self.data = decoder.decodeObjectForKey("data") as ScaryBUGData self.thumbImage = decoder.decodeObjectForKey("thumbImage") as NSImage? self.fullimage = decoder.decodeObjectForKey("fullimage") as NSImage? } |
接下来将模型数据保存到NSUserDefaults. 在MasterVIEwController.swift中添加一个方法:
func saveBUGs() { let data = NSKeyedArchiver.archivedDataWithRootObject(self.BUGs) NSUserDefaults.standardUserDefaults().setobject(data,forKey: "BUGs") NSUserDefaults.standardUserDefaults().synchronize() }这个方法首先将BUGs数组构建为一个NSData对象,然后保存到 |
NSUserDefaults.NSKeyedArchiver。当然数组中的所有对象都实现了NSCoding.
打开AppDelegate.swift,在applicationWillTerminate()中加入:
masterVIEwController.saveBUGs() |
这样,在App退出之前,将所有昆虫数据保存到了NSUserDefaults.
在AppDelegate.swift,找到applicationDIDFinishLaunching的
masterVIEwController.setupSampleBUGs() |
替换为
if let data = NSUserDefaults.standardUserDefaults().objectForKey("BUGs") as? NSData { masterVIEwController.BUGs = NSKeyedUnarchiver.unarchiveObjectWithData(data) as [ScaryBUGDoc] } else { masterVIEwController.setupSampleBUGs() } |
运行程序,添加、删除和编辑昆虫数据,然后退出程序。重新启动App之后,所有上次进行的修改都被保留住了。
注意:如果应用程序不是正常的退出,则saveBUGs()方法不会调用 — 请用Command-Q 退出程序,而不是从Xcode中终止程序。要解决这个问题,你可以在MasterVIEwController的某个恰当的时机调用saveBUG()方法——只要用户进行过新建、删除和编辑 *** 作。
以上是内存溢出为你收集整理的用Swift开发Mac App(8)全部内容,希望文章能够帮你解决用Swift开发Mac App(8)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)