Невозможно перейти на уровень 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. Когда я ставлю точку останова, чтобы увидеть, передается ли это целое число, все проверяется. Если я изначально играл на уровне 3, число, которое в конечном итоге будет nextLevelViewController.levelNumber, равно 4. Игнорируйте num + 2, как я его настроил, значение int по-прежнему будет увеличивать уровень на 1.

Я использую этот же процесс передачи свойств int для всех других моих методов UINavigationController, и все в порядке. Кроме этого. Должен ли я выталкивать контроллер или использовать другой метод для перехода контроллера представления?

Вот метод pop, который я использую, чтобы вернуться к 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
Верно..... извините. Я получаю сообщение об ошибке утверждения при попытке перейти в стек для перехода на следующий уровень (и то же самое при переходе к предыдущему контроллеру). Я где-то читал, что мне нужна ссылка на уже созданный контроллер представления вместо 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, который вы передаете, находится в представлении Куча.   -  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;

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

НО

Если вы хотите сохраняться при перезапусках, вместо этого вы можете сохранить его в 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. Я получаю сообщение об ошибке «свойство levelCompleted не найдено для объекта типа «id». Есть предположения? - person Frank; 19.06.2016
comment
Вы ввели в комментарии «DateModel» вместо «DataModel» — может быть, это так? Если нет, то опубликуйте свой код. - person markt; 19.06.2016