【问题标题】:How to set view of programatically created view controller to SKView?如何将编程创建的视图控制器的视图设置为 SKView?
【发布时间】:2015-09-14 06:04:18
【问题描述】:

我正在开发一款游戏,希望有一个 sprite-kit 场景有自己的视图控制器(经过多次辩论后得出的结论),并且想避免使用故事板(我可以用故事板,但想学习如何在没有故事板的情况下做到这一点)。

在我的主视图控制器中,单击按钮后,我有以下代码

MyViewController2 *test = [[MyViewController2 alloc] init]; 
test.view = [[SKView alloc] init];
[self presentViewController: test animated:YES completion:nil];

但是,这只是转换一个没有任何内容的灰色屏幕(尚未覆盖“-(id)init”)。如果我覆盖 MyViewController2 中的“-(id)init”方法,则会调用以下代码:

-(id)init
{
    NSLog(@"init overwrite works");
    SKView * skView = (SKView *)self.view;
    SKScene2 *scene = [SKScene2 sceneWithSize:skView.bounds.size];
    scene.scaleMode = SKSceneScaleModeFill;
    [skView presentScene:scene];
    return self;
}

但它不会显示,因为我收到此错误:

-[UIView presentScene:]: unrecognized selector sent to instance 

我知道这个错误是什么意思(presentScene 只能由 skView 执行,而不能由 UIView 执行),但即使我创建 ViewController 并在其 init 中将视图设置为仅 SKView,我仍然得到这个错误。我怎样才能解决这个问题?感谢您的时间和帮助。

【问题讨论】:

    标签: ios objective-c uiviewcontroller transition skscene


    【解决方案1】:

    view 属性由UIViewController 管理,代表根视图。您不能在任何时候简单地分配自己的视图。

    选项 1

    如果您想用您自己的视图替换视图属性,您可以覆盖UIViewControllerloadView 方法并在那里分配视图。它记录在此方法的类参考中:

    视图控制器在其视图属性为 请求但目前为零。此方法加载或创建视图并将其分配给视图属性

    ...

    您可以覆盖此方法以手动创建视图。 如果您选择这样做,请将视图层次结构的根视图分配给 视图属性

    所以它看起来像这样:

    - (void)loadView 
    {
        self.view = [[SKView alloc] init];
    }
    

    选项 2

    您可以将您的 SKView 添加为子视图。

    向您的视图控制器添加一个属性,以便您可以在必要时访问它:

    @property (strong, nonatomic) SKView *skView;
    

    加载视图时初始化并添加为子视图:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.skView = [[SKView alloc] init];
        [self.view addSubview:self.skView];
    
        SKScene2 *scene = [SKScene2 sceneWithSize:self.skView.bounds.size];
        scene.scaleMode = SKSceneScaleModeFill;
        [self.skView presentScene:scene];
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多