Не може да премине към ниво 2 (чрез UINavigationController)

В моя GameViewController клас имам този метод displayWinScreen, който получава текущия номер на ниво и го съхранява в публично свойство в моя WinViewController клас, наречено levelCompleted. След това изпълнява този метод, наречен runPushAnimationWithController:, който просто избутва обекта WinViewController в UINavigation стека.

    - (void)displayWinScreen {
        WinViewController *winViewController = [[WinViewController alloc] initWithNibName:@"WinViewController"
                                                             bundle:nil];
        winViewController.levelCompleted = self.levelNumber;
        [self runPushAnimationWithController:winViewController];
    }

След това в WinViewController зададох бутон, който при натискане на iPhone извиква този метод:

    -(IBAction)nextLevelSelection:(id)sender {
        int num = [self.levelCompleted integerValue];
        int newNum = num + 2;
        self.levelCompleted = [NSNumber numberWithInteger:newNum];
        GameViewController* nextLevelViewController = [[GameViewController alloc]
                                                 initWithNibName:@"GameViewController"
                                               bundle:nil];
        nextLevelViewController.levelNumber = self.levelCompleted;
        [self runPushAnimationWithController:nextLevelViewController];

}

Този метод просто увеличава стойността на това свойство и го съхранява в GameViewController свойството levelNumber. Когато поставя точка на прекъсване, за да видя дали това int число се предава, всичко се проверява. Ако първоначално съм играл ниво 3, числото, което в крайна сметка е nextLevelViewController.levelNumber, е 4. Игнорирайте num + 2, както съм го настроил, int стойността все още ще увеличи нивото с 1.

Използвам същия процес на предаване на int свойства за всичките си други UINavigationController методи и всичко е наред. С изключение на това. Трябва ли да извадя контролера или да използвам друга техника за преход на контролера за изглед?

Ето изскачащия метод, който използвам, за да се върна към GameViewController от WinViewController.

    -(void)runPopperAnimation:(UIViewController*)viewController {
        CATransition *transition = [CATransition animation];
        transition.duration = 0.30f;
        transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        transition.type = kCATransitionFade;
        [self.navigationController.view.layer addAnimation:transition forKey:nil];
        [self.navigationController popToViewController:viewController animated:NO];
    }  

person Frank    schedule 18.06.2016    source източник
comment
та какъв е проблема??   -  person markt    schedule 18.06.2016
comment
Точно така..... съжалявам. Получавам Assertion Failure, когато се опитвам да бутна към стека за следващото ниво (и същото нещо с изскачане към предишния контролер). Прочетох някъде, че имам нужда от препратка към контролера за изглед, който вече създадох, вместо alloc-init нов.   -  person Frank    schedule 18.06.2016
comment
Какво казва грешката на твърдението? Целият смисъл на провала на твърдението е да ви кажа какво се е объркало.   -  person markt    schedule 18.06.2016
comment
Грешка при твърдение в -[UINavigationController popToViewController:transition:], /SourceCache/UIKit/UIKit-2380.17/UINavigationController.m:2642   -  person Frank    schedule 18.06.2016
comment
И така, някакви мисли или какво?   -  person Frank    schedule 18.06.2016
comment
Можете ли да публикувате съответния код - където се извиква popToViewController? Кодът, който сте публикували, не показва това.   -  person markt    schedule 18.06.2016
comment
Подозирам, че проблемът е подобен на този: stackoverflow.com/questions/8829905/ Погледнете кода, който извиква вашия метод runPopperAnimation, и вижте дали viewController, който предавате, всъщност е на View Стек.   -  person markt    schedule 18.06.2016
comment
И наистина възнамерявам да използвам това решение, но как бих могъл да предам това свойство levelCompleted от WinViewController обратно към GameViewController?   -  person Frank    schedule 18.06.2016


Отговори (1)


как бих могъл да предам това свойство levelCompleted от WinViewController обратно към GameViewController?

Един от начините е да го съхраните в отделен сингълтън клас:

DataModel.h

@interface DataModel : NSObject

@property NSInteger *levelCompleted;

+ (id)sharedModel;

DataModel.m

#import "DataModel.h"

@implementation DataModel

@synthesize levelCompleted;

/* Return singleton model */
+ (id)sharedModel {
    static DataModel *sharedModel = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedModel = [[self alloc] init];
    });
    return sharedModel;
}

- (id)init {
    self = [super init];
    if (self){
         self.levelCompleted = 0;

    return self;
}

След това можете да извикате този клас от всяко място във вашия код и да промените свойствата му:

NSInteger levelCompleted = [DataModel sharedModel].levelCompleted;

За да увеличите стойността:

[DataModel sharedModel].levelCompleted+=1;

С този метод нивото Completed ще се запази само през жизнения цикъл на изпълнение на приложението. Ако рестартирате устройството или затворите приложението, стойността се губи.

НО

Ако искате да продължите при рестартиране, можете вместо това да го запишете в NSUserDefaults. Това ще продължи през целия живот на инсталирането на приложението:

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];

За да извлечете стойността:

NSNumber *levelCompleted =[standardUserDefaults objectForKey:@"levelCompleted"];

За да запазите стойността:

[stadardUserDefaults setObject:levelCompleted forKey:@"levelCompleted"];
person markt    schedule 18.06.2016
comment
Уау... брилянтно, благодаря за цялата ви помощ. Дори не знаех, че можеш да правиш нещо от това. - person Frank; 18.06.2016
comment
Просто от любопитство, не мога да използвам [DateModel sharedModel].levelCompleted. Получавам грешка „property levelCompleted not found on object of type „id“. някакви мисли? - person Frank; 19.06.2016
comment
Вие сте въвели в коментара „DateModel“ вместо „DataModel“ – може ли това да е? Ако не, публикувайте кода си. - person markt; 19.06.2016