( swift ,OSX)
我目前有一个 View Controller (名为 ViewController),它使用 Storyboard管理我的应用程序的 View , Storyboard由几个用于用户输入的文本框组成。如果用户输入的内容不正确,它会调用一个函数来提醒用户他们的错误(使用 NSAlert
模式),并为他们提供一个选项:重置他们的输入,重置他们的输入和以前的输出,或者关闭窗口。
问题是,单独的警报代码大约有 60 行代码(具有显示适当消息的功能),我想将它移到另一个类中 -- ViewController
的子类,名为 ErrorResponse
,因此它仍然可以访问用户界面以适本地重置他们的输入(即清除输入字符串字段),并执行上述其他任务,同时避免 中的大量函数 View Controller
我已经尝试创建 ViewController
的子类,以便继承用户界面属性,我可以简单地访问它们,但是 Xcode 希望子类使用 NSCoder 实现 init 方法。 (据我所知,这是 Xcode 设置 Storyboard或 .xib 以与 Controller 通信的方式,作为 NSViewController 类的一部分,但这与我的实现无关)。当我尝试传递 nil
或默认初始化的 NSCoder()
对象时,我遇到了模糊的崩溃。
那么,有没有办法组织这些功能呢?还是我应该将它们全部保存在 ViewController 中?
编辑:我还有一个名为 ErrorCheck
的现有类,它执行检查以查看是否有任何错误。在 ViewContoller 中,当输入输入时,有一个 guard
语句,其中包含来自 ErrorCheck 的方法,如果输入以某种方式无效,则在 ErrorResponse
中相应的方法被调用。
代码片段:
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 对象......及其困惑。
最佳答案
我最终只是将方法移到了 ViewController 中。不是最漂亮的,但它很实用。
关于swift - 在 NSViewController 子类中组织函数的替代方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879406/