【发布时间】:2016-04-27 02:52:37
【问题描述】:
(斯威夫特,OSX)
我目前有一个视图控制器(名为 ViewController),它使用情节提要管理我的应用程序的视图,由几个用于用户输入的文本框组成。如果用户输入了不正确的内容,它会调用一个函数来提醒用户他们的错误(使用NSAlert 模态),并为他们提供一个选项:重置他们的输入、重置他们的输入和之前的输出,或者只是关闭窗口。
问题是,仅警报代码就大约有 60 行代码(具有显示适当消息的功能),我想将其移至另一个类——ViewController 的子类,名为ErrorResponse,所以它仍然可以访问用户界面以适当地重置其输入(即清除输入字符串字段),并执行上述其他任务,同时避免ViewController中的大量功能墙
我已经尝试创建ViewController 的子类,以便继承用户界面属性并且我可以简单地访问它们,但是 Xcode 希望子类使用 NSCoder 实现 init 方法。 (据我所知,这是 Xcode 设置故事板或 .xib 与控制器通信的方式,作为 NSViewController 类的一部分,但这与我的实现无关)。当我尝试传递 nil 或默认初始化的 NSCoder() 对象时,我会遇到不明显的崩溃。
那么,有没有办法组织这些功能呢?还是应该将它们全部保存在 ViewController 中?
编辑:我还有一个名为ErrorCheck 的现有类,它执行检查以查看是否有任何错误。在 ViewContoller 中,当输入输入时,有一个 guard 语句,带有来自 ErrorCheck 的方法,如果输入因某种原因无效,则调用 ErrorResponse 中的相应方法。
代码sn-p:
class ViewController: NSViewController {
// Input and output text fields
@IBOutlet weak var inputStr: NSTextField!
@IBOutlet weak var outputStr: NSTextField!
// Input and output conversion selection
@IBOutlet weak var inputSegments: NSSegmentedControl!
@IBOutlet weak var outputSegments: NSSegmentedControl!
@IBAction func outputIsSelected(sender: NSSegmentedControl) {
// Passing all UI elements in (not shown)
// Not ideal, want to be global obj (see below code)
guard ErrorCheck().stringIsNotEmpty(inputStr.stringValue) else {
ErrorResponse().invalidEmptyInput()
return
}
// 0 = DNA, 1 = mRNA, 2 = English
if (inputSegments.selectedSegment == 0) {
checkPossibleConversionAndConvertDNA()
} else if (inputSegments.selectedSegment == 1) {
checkPossibleConversionAndConvertmRNA()
} else if (inputSegments.selectedSegment == 2) {
checkPossibleConversionAndConvertEnglish()
}
}
}
如果我不继承 ViewController,还有另一个问题:我不能为 ErrorResponse 全局定义一个对象,因为我不能在它们被初始化的相同范围内传递 UI 值,所以目前我有在每个对应的函数中初始化了一个ErrorCheck对象……而且它的乱七八糟。
【问题讨论】:
-
由于您没有发布代码,我无法给出具体答案。但我想你可以把你的警报代码放到 NSAlert 的新类子类中,并使用协议与 ViewController 通信。
-
@luiyezheng 更新代码示例