【问题标题】:Alternate way to organize functions in a NSViewController subclass?在 NSViewController 子类中组织函数的替代方法?
【发布时间】: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 更新代码示例

标签: swift nsviewcontroller


【解决方案1】:

我最终只是将方法移到 ViewController 中。不是最漂亮的,但它很实用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 2021-03-04
    • 1970-01-01
    • 2019-04-19
    • 2021-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多