以编程方式在iOS中切换视图

时间:2014-02-03 20:00:34

标签: ios iphone objective-c xcode

我是iOS开发的新手,我正在尝试制作一个简单的算术游戏。它有两个视图,一种带有开始玩游戏的按钮的开始屏幕和一个带有高分的标签,以及播放实际游戏的视图。这是它的截图: Storyboard for my game

游戏的ViewController代码如下所示:

#import "AdditionController.h"
#import "ViewController.h"

@interface AdditionController ()
//properties and outlets here
@end

@implementation AdditionController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
    // Custom initialization
 }
return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view.

    [self setBackground];
    self.difficulty = 20;

    [self setupGame];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)setBackground
{
  ...  
}

-(void)setupGame
{
...
}

-(void)writeQuestion
{
...
}

- (void)advanceTimer:(NSTimer *)timer
{
 ...
}

- (IBAction)checkAnswer:(id)sender {
...  
}

- (IBAction)quit:(id)sender {
    [self gameOver];
}

- (void)gameOver{

NSString *goodbye = [NSString stringWithFormat:@"You scored %d.", self.score_val];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// to store

NSNumber *aNumber = [defaults objectForKey:@"hiScore"];
NSInteger anInt = [aNumber intValue];

if (anInt < self.score_val) {
    [defaults setObject:[NSNumber numberWithInt:self.score_val] forKey:@"hiScore"];
    [defaults synchronize];
    goodbye = [goodbye stringByAppendingString:@"\nThat's a new high score!"];
}


UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"Game Over!" message:goodbye delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[message show];

// I have been using this method to go back to the start screen.
// But this method doesn't update the new highscore
[self.navigationController popViewControllerAnimated:YES];

// However I should be able to do this if I can setup an ID for the start screen
ViewController *svc = [storyboard instantiateViewControllerWithIdentifier:@"StartViewController"];
}

@end

然而,当我去查看 - &gt;实用程序 - &gt;显示Identity Inspector,没有设置故事板ID的选项,只有一个设置恢复ID。 Trying to set storyboard ID

我想知道是否有设置故事板ID,或者我是否遗漏了明显的东西?我正在使用Xcode版本5.0.2(5A3005)。

还想添加一下,我似乎无法从下拉列表中选择UIViewController! can't select UIViewController

2 个答案:

答案 0 :(得分:2)

首先,您的屏幕截图清楚地显示您在故事板中选择了UIView,而不是UIViewController,这是您可以设置故事板ID的内容。因此,如果您要设置ID,则必须确保选择了实际的UIViewController

其次,您通过设置故事板ID尝试做的是创建第一个视图控制器的另一个实例,这不是您想要做的。您仍然拥有此视图控制器的实例,您只想获取该实例并更新其上的高分。您可以通过多种方式执行此操作:

您可以在第二个视图控制器上创建委托协议,其中它具有用于更新高分的委托方法。然后,您将第一个视图控制器设置为第二个视图控制器的委托,在第一个视图控制器中实现委托协议方法,并在适当的时候从第二个视图控制器调用它们。

您可以从第一个可以使用高分(以及任何其他重要信息)调用的第二个视图控制器传递一个块,让第一个视图控制器知道要更新的内容。

您可以使用UINavigationController获取第一个视图控制器。如果它是导航控制器的根视图控制器,那么它将很容易获得。然后,您将获得对已存在实例的引用,并且可以更新高分,但您已经计划这样做。然而,这是最不理想的选择,因为它要求第二个视图控制器知道第一个视图控制器的类型,而实际上这是不必要的。

答案 1 :(得分:1)

更多只是为了加入Gavin的答案,

每当我在故事板中从对象库创建单独的UIViews之前在iOS应用程序中构建简单游戏时,我就将它们放在视图控制器的主视图之外(即将它们移到“First Responder”下面文件大纲视图)。然后你可以创建viewController的这些视图属性,并在按下开始按钮时显示这样的东西,并在下面显示self.gameView:

  

[self.startView removeFromSuperview];

同样适用于揭示self.finishView