J'ai un UIViewController
appelé RootViewController
et un UIViewController
appelé NewsViewController
. Je veux afficher NewsViewController
à l'intérieur d'un UIView
(le UIView
n'est qu'une partie de l'écran) que j'ai créé à l'intérieur de RootViewController
. J'utilise StoryBoard et mon application doit prendre en charge iOS 5 (donc je ne peux pas utiliser de séquences intégrées aka Containers de l'IB)
code 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.
}
J'ai également connecté les deux UIViewControllers avec une séquence. La section d'actualités UIView restera vide. Qu'est-ce que je fais mal?
Modifier:
Cela fonctionne pour moi, est-ce la bonne approche?
- (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];
}
- (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];
}
Swift
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)
}
Rapide> = 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)
}
Créer un enfant, lors de la création du VC racine:
-(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;
}
Ajoutez la vue enfant lorsque la vue racine est créée:
-(void)viewDidLoad
{
[super viewDidLoad];
self.news.view.frame = self.newsSection.bounds;
[self.newsSection addSubview:self.news.view];
}
Voici l'approche de la façon dont cela a fonctionné pour moi.
J'ai 3 boutons en haut Achat, Vente, Location. maintenant, en appuyant sur un bouton particulier, je charge le UIViewController correspondant et j'utilise le storyboard.
J'ai spécifié Storyboard Id
pour chaque UIViewController
.
J'ai ajouté deux UIView
à mon Main ViewController
qui ont ces 3 boutons (Achat, Vente, Location).
une vue que j'utilise pour les trois boutons ci-dessus et une autre que j'utilise pour charger un UIViewController.
Maintenant, en appuyant sur un bouton spécifique, je suis et en appuyant sur un bouton spécifique, je fais le code suivant.
- (IBAction)sellingClicked:(id)sender
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
TestViewController *tvc=[storyboard instantiateViewControllerWithIdentifier:@"test"];
[self.viewContainer addSubview:tvc.view];
[self addChildViewController:tvc];
}
et cela fonctionne parfaitement pour moi, vous pouvez ajouter la vue de défilement si vous souhaitez y faire défiler.
Essaye ça:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard"
bundle:nil];
NewsViewController *rootViewController =
[storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
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);
N'oubliez pas de spécifier une contrainte surtout si vous souhaitez effectuer des animations
Vous devez déplacer votre code vers - (void) viewDidAppear: (BOOL) animé comme ceci
- (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.
}
car le cadre et les limites dans viewDidLoad sont {0,0} {0,0}