2016-04-27 10 views
1

(Swift、OSX)NSViewControllerサブクラスで関数を編成する別の方法はありますか?

現在、ユーザー入力用のテキストボックスからなるストーリーボードを使用してアプリケーションのビューを管理するビューコントローラー(ViewControllerという名前)があります。ユーザーが何か間違ったことを入力した場合は、ユーザーにエラーを警告する関数(モーダル)を呼び出し、入力をリセットし、入力と前回の出力をリセットするか、またはウィンドウを閉じるだけです。

問題は、アラートコードだけで約60行のコード(適切なメッセージを表示する機能を持つ)があり、ViewControllerのサブクラスである別のクラスに移動したいと考えています。その入力を適切にリセットする(つまり、入力文字列フィールドをクリアする)ためのユーザーインターフェイスと、上記の他のタスクを実行します。ViewController

ViewControllerというサブクラスを作成しようとしました。ユーザーインターフェイスのプロパティは継承されていますが、XcodeはそのサブクラスにNSCoderでinitメソッドを実装したいと考えています。 (私の知る限り、これはNSViewControllerクラスの一部としてコントローラと通信するためにXcodeがストーリーボードまたは.xibを設定する方法ですが、これは私のimplmenetationとは無関係です)。 nilまたはデフォルトの初期化済みNSCoder()オブジェクトを渡そうとすると、わかりにくいクラッシュが発生します。

これらの機能を整理する方法はありますか?または、私はそれらをViewControllerにすべて保持する必要がありますか?

編集:エラーがあるかどうかを確認するチェックを実行するErrorCheckという既存のクラスもあります。 ViewContoller内で、入力が入力されると、ErrorCheckからのメソッドを含むguardステートメントがあり、何らかの方法で入力が無効であれば、の対応するメソッドが呼び出されます。

コードスニペット:

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ををサブクラス化していない場合は、別の問題がある:私は同じ内UI値を渡すことはできませんように私は世界的に、はErrorResponseのオブジェクトを定義することはできませんスコープは初期化されているので、現在はそれぞれの対応する関数でErrorCheckオブジェクトを初期化しています。

+0

コードを投稿しないので、具体的な回答はできません。しかし、NSAlertの新しいクラスサブクラスにアラートコードを入れ、プロトコルを使用してViewControllerと通信できると思います。 – luiyezheng

+0

@luiyezhengコード例で更新 – Graystripe

答えて

0

私は、メソッドをViewControllerに移動させるだけでした。一番美しいものではありませんが、機能的です。

関連する問題