2012-04-12 12 views
1

Ich habe ein bisschen Probleme mit diesem! Ich habe definitiv viele Posts angeschaut, aber ich kann es nicht zum Laufen bringen. Zuvor in meiner App konnte ich Daten zwischen Klassen übergeben, indem Sie es einer Eigenschaft zuweisen. Ich bin mir nicht sicher, wo ich hier falsch liege, also würde jede Hilfe geschätzt werden. Ich weiß, dass der folgende Code nicht großartig ist, und ich schaue mir die Wörterbücher an, um zu helfen, aber jetzt möchte ich, dass das funktioniert.Wie eine ganze Zahl an eine Modellklasse übergeben werden

- (IBAction)checkAnswers:(id)sender 
{ 
// The following if statements check user input and checks to see if it is the right answer. 
// The .text parts are uitextfield properties and then shows an image of a tick if correct. 
// It then assigns one to a variable and sums them up at the end (blag)  
if ([eyepiece.text isEqualToString:@"Eyepiece"]) { 
    UIImage *image = [UIImage imageNamed:@"Tick.png"]; 
    [eyepieceTick setImage:image]; 
    a = 1; 
} 

if ([focussingKnobs.text isEqualToString:@"Focussing knobs"]) { 
    UIImage *image = [UIImage imageNamed:@"Tick.png"]; 
    [focussingTick setImage:image]; 

    b = 1; 
} 

if ([objectiveLens.text isEqualToString:@"Objective lenses"]) { 
    UIImage *image = [UIImage imageNamed:@"Tick.png"]; 
    [objectiveTick setImage:image]; 
    c = 1; 
} 

if ([stage.text isEqualToString:@"Stage"]) { 
    UIImage *image = [UIImage imageNamed:@"Tick.png"]; 
    [stageTick setImage:image]; 
    d = 1; 
} 
if ([mirror.text isEqualToString:@"Mirror"]) { 
    UIImage *image = [UIImage imageNamed:@"Tick.png"]; 
    [mirrorTick setImage:image]; 
    e = 1; 
} 

blag = a + b + c + d + e; 

// Here I update a label with the score  

finalScore = [[NSString alloc] initWithFormat:@"%D", blag]; 
[score setText:finalScore]; 

// This is probably where I'm going wrong. I'm allocating a model class called 
// Level_3_Brain and trying to assign a new property in that class (cellsLevelThree) 
// with the score. 

// Level_3_Brain *level = [[Level_3_Brain alloc] init]; 
// level.cellsLevelThree = blag; 

// Updated to 
    [Level_3_Brain sharedInstanceOfLevel3].cellsLevelThree = blag; 


// I then set them all back to zero so that the score doesn't go above 5 
a = 0, b = 0, c = 0, d = 0, e = 0; 
blag = 0; 

} 

Meine Modellklasse .h hat jetzt:

@interface Level_3_Brain : NSObject 

+ (id)sharedInstanceOfLevel3; 

@property (nonatomic) int cellsLevelThree; 

@end 

Mein .m hat jetzt diesen Code aus dem Artikel Singleton genommen:

@implementation Level_3_Brain 
@synthesize cellsLevelThree; 

static Level_3_Brain *sharedInstanceOfLevel3 = nil; 

// Get the shared instance and create it if necessary. 
+ (Level_3_Brain *)sharedInstanceOfLevel3 { 
if (sharedInstanceOfLevel3 == nil) 
{ 
sharedInstanceOfLevel3 = [[super allocWithZone:NULL] init]; 
} 



return sharedInstanceOfLevel3; 


} 

// We can still have a regular init method, that will get called the first time the Singleton is used. 

- (id)init 
{ 
self = [super init]; 

if (self) { 
    // Work your initialising magic here as you normally would 
} 

NSLog(@"%@", cellsLevelThree); 

return self; 
} 

// Your dealloc method will never be called, as the singleton survives for the duration of your app. 
// However, I like to include it so I know what memory I'm using (and incase, one day, I convert away from Singleton). 
-(void)dealloc 
{ 
// I'm never called! 
// [super dealloc]; 
} 

/We don't want to allocate a new instance, so return the current one. 
+ (id)allocWithZone:(NSZone*)zone { 
return [self sharedInstanceOfLevel3]; 
} 

// Equally, we don't want to generate multiple copies of the singleton. 
- (id)copyWithZone:(NSZone *)zone { 
return self; 
} 


@end 

Leider, ich bin jetzt immer die Fehler "Eigenschaft 'cellsLevelThree' nicht gefunden Objekt des Typs ID. Bitte helfen Sie!

+0

Um das neueste Problem anzugehen, sollten Sie '+ (id) sharedInstanceOfLevel3;' mit seinem richtigen Typ '+ (Level_3_Brain) sharedInstanceOfLevel3;' in der .h-Datei deklarieren oder die eckige Klammer-Syntax verwenden, um auf 'cellsLevelThree' zuzugreifen Eigenschaft anstelle der Punktsyntax. – dasblinkenlight

+0

Fertig, zumindest läuft es jetzt! :) Es gibt jetzt 0 in der Konsole zurück und wird nicht jedes Mal aktualisiert, wenn die Return-Taste gedrückt wird ... –

+0

Wird der Score-Text auf den korrekten Wert aktualisiert? – dasblinkenlight

Antwort

1

Sie richtig identifiziert den Ort w Hier "irren" Sie in Ihrem Kommentar: Das Problem besteht nicht darin, dass Sie den Wert falsch setzen, sondern darin, dass Sie ihn auf eine brandneue Instanz setzen, die für die Methode lokal ist, und sofort auf der Seite gelöscht wird Beenden Sie diese Methode.

Im Allgemeinen sollten Ihre Modellklassen beim Start der Anwendung erstellt werden und während der gesamten Lebensdauer Ihrer Anwendung verfügbar bleiben. Dies wird oft unter Verwendung von singletons erreicht.

+0

Vielen Dank für Ihre Hilfe, es ist sehr geschätzt. Ich kann noch nicht updaten, weil ich nicht genug Reputation habe (traurig weiß ich), aber ich werde es tun, sobald ich kann. –

+0

Nachdem ich den Singleton-Artikel (interessant) gelesen habe, denke ich, dass es mir später in meiner App helfen könnte, wo ich etwas kompliziertere Dinge machen möchte. Aber müsste ich es jetzt irgendwo anders einrichten, das nicht lokal ist? Oder machen Sie eine neue Methode ... –

+1

@RobW Sie können eine bestehende Klasse in einen Singleton verwandeln, indem Sie eine gemeinsam genutzte Instanz innerhalb der Klasse bereitstellen. Wenn Sie zum Beispiel "Level_3_Brain" in Singleton umgewandelt haben, können Sie '[Level_3_Brain instance] .cellsLevelThree = blag' von einer beliebigen Stelle in Ihrer Anwendung aus schreiben, an der Sie den Header des Modells eingefügt haben, und der Wert bleibt geteilt. – dasblinkenlight

Verwandte Themen