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];