ViewController addSubview

Я почти схожу с ума

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] init];
[self.view addSubview:golOlur.view];

У меня есть код выше, и я называю это в IBACtion внутри ViewController, GolOlurActionViewController это ViewController как вы все можете догадаться.

Когда процесс начинается, golOlur's viewDidLoad а также viewDidAppear методы вызываются, но представление не отображается.

Я перепробовал все, что знаю, но не смог решить.

2 ответа

Решение

Вы действительно не должны использовать addSubview если ваше намерение заключается в переходе между взглядами. Если вы это сделаете, вы не будете получать события ротации, потому что вы позволяете иерархии контроллера представления не синхронизироваться с иерархией представления. Вы должны использовать addSubview только чтобы добавить настоящее подпредставление (например, UILabel, UIImageView, UIButtonи т. д., или дочернее представление, если оно выполняет правильное отображение контроллера представления и т. д.) к представлению. Использование addSubview переход между представлениями представляет собой фундаментальную путаницу между контроллерами представления и представлениями.

Ключ к правильному управлению вашими представлениями заключается в том, чтобы убедиться, что ваша иерархия контроллера представления синхронизирована с вашей иерархией представления. Самый простой способ сделать это - выполнить переход между контроллерами представления и позволить им позаботиться о представлении своих представлений. Таким образом, если вы используете NIB, это обычно будет:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:golOlur animated:YES completion:nil];

Или NIB с навигационным контроллером:

GolOlurActionViewController *golOlur = [[GolOlurActionViewController alloc] initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:golOlur animated:YES];

Или, если вы используете раскадровки (опять же, если бы вы использовали раскадровки, вы, вероятно, использовали бы сегменты и не нуждались бы в этом, но только для полноты):

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"];
[self presentViewController:golOlur animated:YES completion:nil];

и если ваши раскадровки используют навигационные контроллеры:

GolOlurActionViewController *golOlur = [self.storyboard instantiateViewControllerWithIdentifier:@"GolOlurActionView"];
[self.navigationController pushViewController:pushViewController:golOlur animated:YES];

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

Обновить:

В общем, если вы используете раскадровки (я не думаю, что вы, но на всякий случай), а не instantiateViewControllerWithIdentifierЯ мог бы на самом деле предложить вам определить переход на раскадровке, предоставить ему строку идентификатора в Интерфейсном Разработчике, а затем использовать следующий код для перехода к следующей сцене:

[self performSegueWithIdentifier:@"yourIdentifier" sender:self];

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

Я полагаю, что ваша проблема в том, что вы ожидаете, что представление в раскадровке или.xib появится при создании UIViewController таким, какой вы есть, что не будет работать. Вам нужно либо подключиться к пуш-сегу в раскадровке (что потребует UINavigationController) или представить новый контроллер модально, что вы также можете сделать в раскадровке. Если у вас есть перо для этого ViewController, вы можете сделать это:

 CustomViewController *controller = [[CustomViewController alloc] initWithNibName:@"CustomViewController.xib" bundle:[NSBundle mainBundle]];

 [self presentViewController:controller animated:YES completion:NULL];    
Другие вопросы по тегам