2011-01-15 8 views
0

Ich bin ein C++ Programmierer neu in Objective-c.Klassenmethode (NSString-Typ), die von viewcontroller aufgerufen wird, gibt nil?

Ich habe eine Taschenrechner-App erstellt, die mit einer einzigen Ansicht funktioniert. Ich habe eine Berechnungsklasse und einen ViewController. Jedes Mal, wenn eine Schaltfläche gedrückt wird, ruft eine IBAction-Methode in ViewController Methoden auf, die in der Calculations-Klasse definiert sind, um die Eingabe zu verarbeiten, und gibt die Ausgabe als NSString zurück, die ich dann als Wert für das label.text-Feld festlege.

Jetzt arbeite ich an einer Tab Bar App mit der gleichen Berechnungsklasse. Diese App verfügt über zwei Registerkarten, die jeweils über einen eigenen Satz von Eingabetasten für den Taschenrechner verfügen (beide Ansichten teilen dieselben Eingabe-/Ausgabedaten). Die erste Registerkarte ist identisch mit meiner ersten App mit der Einzelansicht, also versuche ich dies auf ähnliche Weise zu tun. Hier

ist das Problem:

Wenn eine Taste gedrückt wird, wird die IBAction Methode, die die Eingangshandgriffe durchläuft die Anrufe zu den Berechnungen Klassenmethoden (siehe unten), ohne Fehler:

-(IBAction)readInput:(id)sender {  
    [_calculations input:[sender titleForState:UIControlStateNormal]]; 
    inputField.text = [_calculations inputDisplay]; 
    outputField.text = [_calculations outputDisplay]; 
} 

jedoch Die Methoden inputDisplay und outputDisplay geben nil zurück. Mit dem Debugger habe ich bemerkt, dass ich nicht in der Lage bin, die Aufrufe von _calculations-Methoden zu "betreten", stattdessen wird die Zeile übersprungen und der von beiden zurückgegebene Wert ist null. Ich habe die folgende Methode hinzugefügt:

und wenn ich dies an die Eingabe-Tasten anschließe, kann ich die Anzeige aktualisiert sehen. Dies scheint ein Problem beim Aufrufen der _calculations-Elementfunktionen und der Tab-Bar-Ansichten zu sein (da dieses Problem bei Verwendung einer einzelnen Ansicht nicht vorhanden ist).

Ich weiß, dass ich eine Menge Informationen weggelassen habe, aber ich habe es getan, um irrelevante Informationen zu vermeiden. Ich werde alle Details zur Verfügung stellen, die notwendig sind, wenn Sie gefragt werden.

+0

Hinweis: Sie können [Formatzeilen als code] (http://meta.stackexchange.com/questions/22186/how-do-i-format-my-code-blocks) durch Einrücken sie vier Räume. Die Schaltfläche "{}" in der Editor-Symbolleiste erledigt dies für Sie. Bearbeiten Sie Ihre Frage und probieren Sie es aus. Klicken Sie auf das orangefarbene Fragezeichen in der Editor-Symbolleiste, um weitere Informationen und Tipps zum Formatieren zu erhalten. – outis

+0

Der Beispielcode ist tatsächlich [unvollständig] (http://sscce.org/). Wie wird '_calculations' festgelegt? Ist es Null?Was sind die Methoden "inputDisplay" und "outputDisplay"? Wenn sie Eigenschaften von 'Calculation' sind, wie werden sie gesetzt? Was sind die Bindungen in IB? – outis

Antwort

1

Überprüfen Sie, ob _calculations nicht Null ist.

Sie können jede Nachricht (rufen Sie eine Methode) auf nil und es wird nur nil zurückgeben, keine Ausnahme verursachen.

0

Ohne mehr Code zu sehen, wird es ein bisschen schwierig zu diagnostizieren.

Wenn ich versuchte, dieses Problem zu debuggen, würde ich zuerst sicherstellen, dass _calculations auf das Objekt zeigt, auf das es zeigen soll. Wenn es von einer NIB geladen wird, wird es möglicherweise nicht initialisiert und ist immer noch null. Sie können Nachrichten ohne Probleme an keine Objekte senden. Wenn ein Objekt eine Nachricht erhält, die es nicht verarbeiten kann (die Methode existiert nicht oder das Zielobjekt ist null), ist die Rückgabe für diesen Aufruf gleich Null.

Ich habe in der Vergangenheit Initialisierungscode in die init: -Methode geschrieben und einige Stunden damit verbracht, warum nicht aufgerufen wurde, bis mir klar wurde, dass ich meinen init-Code in viewDidLoad :, oder der initWithNibName: bundle: oder sogar der initWithCoder: selector.

HTH, Matt

Verwandte Themen