1

こいつにはちょっと困った!私は間違いなく多くの投稿を調べましたが、うまくいきません。以前のアプリでは、データをプロパティに割り当てることで、クラス間でデータを渡すことができました。ここでどこが間違っているのかわからないので、助けていただければ幸いです。次のコードが良くないことはわかっており、辞書を調べていますが、今のところ、これを機能させたいと考えています。

- (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;

}

私のモデルクラス .h には次のものがあります。

@interface Level_3_Brain : NSObject 

+ (id)sharedInstanceOfLevel3;

@property (nonatomic) int cellsLevelThree;

@end

私の .m には、シングルトンの記事から取得した次のコードがあります。

@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

残念ながら、「タイプ ID のオブジェクトにプロパティ 'cellsLevelThree' が見つかりません。助けてください!!」というエラーが表示されます。

4

1 に答える 1

1

コメントで「間違っている」場所を正しく特定しました。問題は、値を間違って設定していることではなく、メソッドにローカルな新しいインスタンスに設定していることです。そのメソッドを終了するとすぐに破棄されます。

一般に、モデル クラスはアプリケーションの起動時に作成され、アプリケーションの存続期間全体にわたって利用可能である必要があります。多くの場合、これはシングルトンを使用して実現されます。

于 2012-04-12T10:38:49.013 に答える