Значения объекта NSMutableArray не сохраняются при возврате из файла моей модели .m - PullRequest
0 голосов
/ 13 марта 2012

Ошибка новичка?

Я работаю над приложением для викторин, которое использует результаты ответов из контроллера представлений, создает объекты NSMutableArray для значений totalCorrect и totalTried в файле .m модели KeepScore, и модель возвращает оценку обратно в мой контроллер представления. Затем контроллер представления обновляет мою метку счета в моем представлении. Затем я использую UINavigationController, чтобы перейти к следующему контроллеру представления, а затем жду, когда пользователь введет ответ на следующий вопрос викторины. Проблема заключается в том, что в следующий раз, когда я вызову свой файл .m модели KeepScore из моего контроллера представления 2, объекты NSMutableArray в модели KeepScore .m вернутся к нулевым значениям. Я удостоверился, что мои значения объекта NSMutableArray были правильными (не нулевыми) прямо перед возвратом из моей модели KeepScore .m к моему контроллеру представления 1. Я работаю iOS 5.1 с Xcode 4.3.1 с ARC. Мое свойство NSMutableArray в моем личном объявлении API в файле модели .m является сильным. Разве модель KeepScore .m не должна сохранять значения моего массива, когда я возвращаюсь в свой контроллер представления, чтобы я мог использовать их снова, когда я вызываю свою модель из моего следующего контроллера представления? Сначала я хотел спросить в формулировке, чтобы увидеть, поймал ли кто-нибудь какую-нибудь глупую логику, которая у меня есть. Я напишу код, если полезно.

Вот моя модель KeepScore.h #import

@interface KeepScore : NSObject

- (float)score:(BOOL)questionCorrect:(BOOL)questionTotal:(BOOL)firstScoringPass;
@end

Вот моя реализация KeepScore.m модели:

#import "KeepScore.h"

@interface KeepScore()
@property (nonatomic, strong) NSMutableArray *correctScoreValues;
@end

@implementation KeepScore

@synthesize correctScoreValues = _correctScoreValues;

- (NSMutableArray *)correctScoreValues
{
    if (_correctScoreValues == nil) _correctScoreValues = [[NSMutableArray alloc] init];
    return _correctScoreValues;
}

- (float)score:(BOOL)questionCorrect:(BOOL)questionTotal:(BOOL)firstScoringPass {

int totalTried;
int totalCorrect;
NSLog(@"firstScoringPass = %@", firstScoringPass ? @"YES" : @"NO");
NSLog(@"questionCorrect = %@", questionCorrect ? @"YES" : @"NO");
NSLog(@"questionTotal = %@", questionTotal ? @"YES" : @"NO");
if (firstScoringPass) {
    int totalTriedInt = 0;
    int totalCorrectInt = 0;
    NSNumber *correct = [NSNumber numberWithInt:totalCorrectInt];
    NSNumber *tried = [NSNumber numberWithInt:totalTriedInt];
    [self.correctScoreValues addObject:correct];
    [self.correctScoreValues addObject:tried];
    firstScoringPass = NO;
}

if (questionCorrect) {
    totalCorrect = ([[self.correctScoreValues objectAtIndex:0] intValue] + 1);
    NSLog(@"totalCorrect = %d", totalCorrect);
    NSNumber *correct = [NSNumber numberWithInt:totalCorrect];
    NSLog(@"correct = %@", correct);
    [self.correctScoreValues replaceObjectAtIndex:0 withObject:correct];
    NSLog(@"correct value in array = %d",[[self.correctScoreValues objectAtIndex:0] intValue]);
} else {
    totalCorrect = [[self.correctScoreValues objectAtIndex:0] intValue];
}

NSLog(@"totalCorrect = %d", totalCorrect);
if (questionTotal) {
    NSLog(@"tried value in array = %d", [[self.correctScoreValues objectAtIndex:1] intValue]);
    totalTried  = ([[self.correctScoreValues objectAtIndex:1] intValue] + 1);
    NSNumber *tried = [NSNumber numberWithInt:totalTried];
    [self.correctScoreValues replaceObjectAtIndex:1 withObject:tried];
    NSLog(@"tried value in array = %d", [[self.correctScoreValues objectAtIndex:1] intValue]);
}

float score = (totalCorrect/totalTried);
NSLog(@"score = %0.2f", score);
NSLog(@"totalCorrect = %d, totalTried = %d", totalCorrect, totalTried);

NSLog(@"correct value in array = %d", [[self.correctScoreValues objectAtIndex:0] intValue]);
NSLog(@"tried value in array = %d", [[self.correctScoreValues objectAtIndex:1] intValue]);

return score;
}
@end

Вот один из моих файлов ViewControllers .m:

#import "MapQuizViewController.h"
#import "KeepScore.h"

@interface MapQuizViewController()
@property (nonatomic, strong) KeepScore *scoreModel;
@property (nonatomic) BOOL questionTotal;
@property (nonatomic) BOOL questionCorrect;
@property (nonatomic) BOOL firstScoringPass;
@end

@implementation MapQuizViewController
@synthesize gradeLabel = _gradeLabel;
@synthesize scoreLabel = _scoreLabel;

@synthesize scoreModel = _scoreModel;
@synthesize questionTotal = _questionTotal;
@synthesize questionCorrect = _questionCorrect;
@synthesize firstScoringPass = _firstScoringPass;

- (KeepScore *)scoreModel;
{
    if (!_scoreModel) _scoreModel = [[KeepScore alloc] init];
    return _scoreModel;
}

- (IBAction)answerButtonPressed:(UIButton *)sender 
{

NSString *answerChoice = sender.currentTitle;
NSString *correct = [NSString stringWithFormat:@"Correct!"];
NSString *incorrect = [NSString stringWithFormat:@"Incorrect"];
self.questionTotal = YES;
self.firstScoringPass = YES;
if ([answerChoice isEqualToString:@"Australia"]) {
    self.gradeLabel.textColor = [UIColor blueColor];
    self.gradeLabel.text = [NSString stringWithFormat:@"%@",correct];
    self.questionCorrect = YES;
    self.scoreLabel.text = [NSString stringWithFormat:@"%0.2f",[self.scoreModel score:_questionCorrect :_questionTotal :_firstScoringPass]];
} else if ([answerChoice isEqualToString:@"U.S."]) {
    self.gradeLabel.textColor = [UIColor redColor];
    self.gradeLabel.text = [NSString stringWithFormat:@"%@", incorrect];
    self.questionCorrect = NO;        
    self.scoreLabel.text = [NSString stringWithFormat:@"%0.2f",[self.scoreModel score:_questionCorrect :_questionTotal :_firstScoringPass]];
} else if ([answerChoice isEqualToString:@"China"]) {
    self.gradeLabel.textColor = [UIColor redColor];
    self.gradeLabel.text = [NSString stringWithFormat:@"%@", incorrect];
    self.questionCorrect = NO;        
    self.scoreLabel.text = [NSString stringWithFormat:@"%0.2f",[self.scoreModel score:_questionCorrect :_questionTotal :_firstScoringPass]];
}
}
- (void)viewDidUnload {
  [self setScoreLabel:nil];
   [super viewDidUnload];
  }
@end

1 Ответ

0 голосов
/ 17 марта 2012

Во-первых, один файл .m ничего не значит.Я думаю, вы предположили, что существует один экземпляр файла Class на .m, который не соответствует действительности.

, например,

// in .m file
static int *myInt; // only one `myInt` exist

// in .h or .m file
@interface MyClass : NSObject {
    int myVar;    // each MyClass instance will have its own `myVar` which are different
}

// somewhere else
MyClass *a = [[MyClass alloc] init];
MyClass *b = [[MyClass alloc] init];
a->myVar = 1;
b->myVar = 2;
// a->myVar is 1 and b->myVar is 2

Если вы не передали свой экземпляр KeepScore, недавносозданный не будет иметь данных предыдущего.

Вы должны либо сделать синглтон KeepScore, либо передать его из старого контроллера представления в новый контроллер представления

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...