web-dev-qa-db-fra.com

Charger UIViewController dans une vue conteneur à l'aide de StoryBoard

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];
}
26
Segev
- (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)
}
44
Segev

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];
}
10
Aleksey Kozhevnikov

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.

1
ProgrammingNinja

Essaye ça:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                                                     bundle:nil];
NewsViewController *rootViewController = 
 [storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"];
1
Lithu T.V
        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

1
Vassily

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}

0
stosha