用Swift开发Mac App(8)

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

概述关注细节 关于用户体验方面,我们仍然有一些细节值得注意。例如:运行App,不要选择任何昆虫,点击“Delete” 或者 “Change Picture” 按钮,什么都不会发生,Why? 作为程序员,你当然知道当用户什么都没选择的情况下,不应当执行任何 *** 作,但对于用户而言,这种情况仍然显得不太友好: 我们通过以下方式来解决这个问题: ·      如果用户选中了某个单元格,我们才让Delete按钮、 关注细节

关于用户体验方面,我们仍然有一些细节值得注意。例如:运行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)所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存