2016-04-27 4 views
1

(Swift, OSX)Alternative Möglichkeit, Funktionen in einer NSViewController-Unterklasse zu organisieren?

Ich habe derzeit einen View-Controller (namens ViewController), der die Ansicht meiner Anwendung mit Storyboards verwaltet, bestehend aus ein paar Textfelder für Benutzereingaben. Wenn der Benutzer etwas falsch eingibt, ruft er eine Funktion auf, die den Benutzer auf seinen Fehler hinweist (mit einem NSAlert modalen) und bietet ihnen eine Option an: ihre Eingabe zurücksetzen, ihre Eingabe und vorherige Ausgabe zurücksetzen oder das Fenster einfach schließen.

Problem ist, geschweige denn, dass Alarm Code etwa 60 Zeilen Code (mit Funktionen entsprechende Meldungen angezeigt werden), und ich möchte es in einer anderen Klasse bewegen - eine Unterklasse von ViewController, ErrorResponse berechtigte, so kann es nach wie vor Zugang die Benutzeroberfläche zurücksetzen entsprechend ihrer Eingabe (dh eine Eingabezeichenfolge Feld löschen), und die anderen oben genannten Aufgaben tun, während eine massive Wand von Funktionen in der ViewController

vermeiden ich habe versucht, eine Unterklasse von ViewController so die Schaffung von Benutzeroberflächeneigenschaften werden vererbt und ich kann einfach darauf zugreifen, Xcode möchte jedoch, dass die Unterklasse eine Init-Methode mit NSCoder implementiert. (Soweit ich weiß, richtet Xcode so ein Storyboard oder eine .xib ein, um mit dem Controller als Teil der NSViewController-Klasse zu kommunizieren, was aber nichts mit meiner Implementation zu tun hat). Wenn ich versuche, nil oder ein standardmäßig initialisiert NSCoder() Objekt zu übergeben, bekomme ich obskure Abstürze.

Also, gibt es eine Möglichkeit, diese Funktionen zu organisieren? Oder sollte ich sie alle im ViewController behalten?

Edit: Ich habe auch eine bestehende Klasse namens ErrorCheck, die die Überprüfung durchführt, um zu sehen, ob es irgendwelche Fehler gibt. Innerhalb der ViewContoller, wenn die Eingabe eingegeben wird, gibt es eine guard-Anweisung mit einer Methode von ErrorCheck, und wenn die Eingabe in irgendeiner Weise ungültig ist, werden die entsprechenden Methoden in ErrorResponse aufgerufen.

Code-Snippet:

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() 
     } 

    } 
} 

Wenn ich Viewcontroller nicht Unterklasse gibt es ein anderes Problem ist: ich ein Objekt für Error nicht global definieren kann, da ich nicht die UI-Werte im gleichen passieren kann Bereich, wie sie gerade initialisiert werden, so habe ich derzeit ein ErrorCheck-Objekt in jeder entsprechenden Funktion ... und seine unordentlich.

+0

Da Sie Ihren Code nicht veröffentlichen, kann ich keine spezifische Antwort geben. Aber ich schätze, Sie können Ihren Alarmcode in eine neue Klassenunterklasse für NSAlert setzen und mit ViewController über das Protokoll kommunizieren. – luiyezheng

+0

@luiyezheng Aktualisiertes Code-Beispiel – Graystripe

Antwort

0

Ich landete nur die Methoden in ViewController. Nicht das schönste, aber es ist funktional.

Verwandte Themen