Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Can';t转换到2级(使用UINavigationController)_Ios_Objective C_Xcode_Uinavigationcontroller - Fatal编程技术网

Ios Can';t转换到2级(使用UINavigationController)

Ios Can';t转换到2级(使用UINavigationController),ios,objective-c,xcode,uinavigationcontroller,Ios,Objective C,Xcode,Uinavigationcontroller,在我的GameViewController类中,我有一个方法displayWinScreen,它获取当前的级别号,并将其存储在我的WinViewController类中名为levelCompleted的公共属性中。然后它运行名为runPushAnimationWithController:的方法,该方法仅将WinViewController对象推送到UINavigation堆栈上 - (void)displayWinScreen { WinViewController *

在我的
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级,那么最终的数字是4。忽略
num+2
,按照我的设置方式,int值仍然会将级别增加1

我对所有其他UINavigationController方法使用相同的传递int属性的过程,一切都正常。除了这个。我应该弹出控制器还是使用另一种技术来转换视图控制器

下面是我用来从
WinViewController
返回
GameViewController
的pop方法

    -(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];
    }  
我如何才能将levelCompleted属性从 WinViewController是否备份到GameViewController

一种方法是将其存储到单独的singleton类:

数据模型

@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;
NSNumber *levelCompleted =[standardUserDefaults objectForKey:@"levelCompleted"];
[stadardUserDefaults setObject:levelCompleted forKey:@"levelCompleted"];
使用此方法,levelCompleted将仅在应用程序执行的整个生命周期内保持。如果重新启动设备或关闭应用程序,该值将丢失

但是

如果您希望在重启期间保持,则可以将其保存为NSUserDefaults。这将持续应用程序安装的整个生命周期:

NSUserDefaults *standardUserDefaults = [NSUserDefaults standardUserDefaults];
要检索该值,请执行以下操作:

[DataModel sharedModel].levelCompleted+=1;
NSNumber *levelCompleted =[standardUserDefaults objectForKey:@"levelCompleted"];
[stadardUserDefaults setObject:levelCompleted forKey:@"levelCompleted"];
要保存该值,请执行以下操作:

[DataModel sharedModel].levelCompleted+=1;
NSNumber *levelCompleted =[standardUserDefaults objectForKey:@"levelCompleted"];
[stadardUserDefaults setObject:levelCompleted forKey:@"levelCompleted"];

那么问题出在哪里?对……对不起。我在尝试将堆栈推到下一个级别时(与弹出到上一个控制器的情况相同),断言失败。我在某个地方读到,我需要一个对我已经创建的视图控制器的引用,而不是一个新的alloc init?断言失败的全部意义在于告诉您出了什么问题。在-[UINavigationController popToViewController:transition:]、/SourceCache/UIKit/UIKit/UIKit-2380.17/UIKit-2380.17/UINavigationController中断言失败。m:2642您有什么想法吗?哇……太棒了,谢谢您的帮助。我甚至不知道你能做这些。只是出于好奇,我无法使用
[DateModel sharedModel].levelCompleted
。我在类型为“id”的对象上收到错误“property levelCompleted not found”。有什么想法吗?你输入的是“DateModel”而不是“DataModel”——可能是这样吗?如果没有,那么发布你的代码。