Как настроить представление программно созданного контроллера представления на SKView?

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

В моем контроллере основного представления после нажатия кнопки у меня есть следующий код

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

Однако это просто переходит в серый экран, на котором ничего нет (еще не перезаписал «-(id) init»). Следующий код вызывается, если я перезаписываю метод "-(id)init" в MyViewController2:

-(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 и в его инициализации я устанавливаю представления только SKView, я все равно получаю эту ошибку . Как я могу это исправить? Спасибо за ваше время и помощь.


person user3797886    schedule 27.06.2015    source источник


Ответы (1)


Свойство view управляется UIViewController и представляет корневое представление. Вы не можете просто назначить свой собственный вид в любой точке.

Вариант 1

Если вы хотите заменить свойство представления своим собственным представлением, вы можете переопределить метод UIViewController loadView и назначить представление там. Это задокументировано в справочнике по классам для этого метода:

Контроллер представления вызывает этот метод, когда запрашивается его свойство представления, но в настоящее время оно равно нулю. Этот метод загружает или создает представление и присваивает его свойству представления.

...

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

Таким образом, это будет выглядеть примерно так:

- (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];
}
person Artal    schedule 27.06.2015