Загрузите UIViewController внутри контейнера с помощью StoryBoard
У меня есть UIViewController
, называемый RootViewController
и A UIViewController
, называемый NewsViewController
. Я хочу показать NewsViewController
внутри a UIView
(UIView
- это только часть экрана), который я создал внутри RootViewController
. Я использую StoryBoard, и мое приложение должно поддерживать iOS 5 (поэтому я не могу использовать встроенные сегменты aka Containers из IB)
Код RootViewController:
- (void)viewDidLoad
{
[super viewDidLoad];
NewsViewController *news = [[NewsViewController alloc]init];
news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:news.view];
[self addChildViewController:news];
// Do any additional setup after loading the view.
}
Я также подключил оба UIViewControllers с помощью segue. UIView newsSection останется пустым.
Что я делаю неправильно?
Edit:
Это работает для меня, это правильный подход?
- (void)viewDidLoad
{
[super viewDidLoad];
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:news.view];
[self addChildViewController:news];
[news didMoveToParentViewController:self];
}
Ответы
Ответ 1
- (void)viewDidLoad
{
[super viewDidLoad];
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:news.view];
[self addChildViewController:news];
[news didMoveToParentViewController:self];
}
Свифта
override func viewDidLoad() {
super.viewDidLoad()
let news = self.storyboard?.instantiateViewControllerWithIdentifier("NewsViewControllerID") as! NewsViewController
news.view.frame = newsSection.bounds
newsSection.addSubview(news.view)
addChildViewController(news)
news.didMoveToParentViewController(self)
}
Swift >= 3:
override func viewDidLoad() {
super.viewDidLoad()
let news = self.storyboard?.instantiateViewController(withIdentifier: "NewsViewControllerID") as! NewsViewController
news.view.frame = newsSection.bounds
newsSection.addSubview(news.view)
addChildViewController(news)
news.didMove(toParentViewController: self)
}
Ответ 2
Создайте дочерний элемент при создании root VC:
-(void)awakeFromNib
{
[super awakeFromNib];
// Create news vc from storyboard
UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"YourStoryboard" bundle:nil];
NewsViewController *news = [storyboard instantiateViewControllerWithIdentifier:@"News VC ID, you should set it in IB"];
// Add it as a child to root
[self addChildViewController:news];
[news didMoveToParentViewController:self];
// Save it for future use
self.news = news;
}
Добавить дочерний вид при создании корневого представления:
-(void)viewDidLoad
{
[super viewDidLoad];
self.news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:self.news.view];
}
Ответ 3
Попробуйте следующее:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
NewsViewController *rootViewController =
[storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
Ответ 4
Вот такой подход, как он работал у меня.
У меня есть 3 кнопки в верхней части. Покупка, продажа, аренда. теперь при нажатии на любую конкретную кнопку я загружаю соответствующий UIViewController, и я использую раскадровку.
Я указал Storyboard Id
для каждого UIViewController
.
Я добавил два UIView
в мой Main ViewController
, у которых есть эти 3 кнопки (покупка, продажа, аренда).
один вид, который я использую для указанных выше трех кнопок и других, которые я использую для загрузки UIViewController.
Теперь, нажав на определенную кнопку, я и нажав определенную кнопку, я делаю следующий код.
- (IBAction)sellingClicked:(id)sender
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
TestViewController *tvc=[storyboard instantiateViewControllerWithIdentifier:@"test"];
[self.viewContainer addSubview:tvc.view];
[self addChildViewController:tvc];
}
и он отлично работает для меня, вы можете добавить прокрутку View i, которую вы хотите прокрутить там.
Ответ 5
otherController!.view.frame = container.bounds;
self.addChildViewController(otherController!);
container.addSubview(otherController!.view);
container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|[view]|", options: .allZeros, metrics: nil, views: ["view": otherController!.view]))
container.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|[view]|", options: .allZeros, metrics: nil, views: ["view": otherController!.view]))
otherController!.didMoveToParentViewController(self);
Не забудьте указать ограничение, особенно если вы хотите выполнять анимацию
Ответ 6
Вы должны переместить свой код в - (void) viewDidAppear: (BOOL), анимированный как
- (void) viewDidAppear: (BOOL) animated
{
[super viewDidAppear: animated];
NewsViewController *news = [[NewsViewController alloc]init];
news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:news.view];
[self addChildViewController:news];
// Do any additional setup after loading the view.
}
потому что кадр и границы в viewDidLoad являются {0,0} {0,0}