2013-07-25 18 views
26

Ho un UIViewController chiamato RootViewController e A UIViewController chiamato NewsViewController. Voglio mostrare NewsViewController all'interno di uno UIView (lo UIView è solo una parte dello schermo) che ho creato all'interno di RootViewController. Sto usando StoryBoard e la mia applicazione ha bisogno di supportare iOS 5 (quindi non posso usare segues incorporati alias Container dalla IB) codice diCarica UIViewController in una vista Contenitore usando StoryBoard

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. 
} 

Ho anche collegato sia con UIViewControllers un seguito. La newsSection di UIView rimarrà vuota. Cosa sto facendo male?

Edit:

Questo funziona per me, è che l'approccio giusto?

- (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]; 
} 
+0

si è tentato il mio risposta? – stosha

+0

Sì. Non ha funzionato. – Segev

risposta

41
- (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) 
} 

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) 
} 
+0

Ottima risposta e nota anche ... http://stackoverflow.com/a/13867671/294884 – Fattie

+1

Utilizzare self.storyboard in un controller di visualizzazione anziché ricaricarlo. –

+0

Ho dato questo risultato non mi aspettavo proprio di farlo esattamente come volevo ... ma lo ha fatto! All'inizio avevo un ciclo infinito perché stavo caricando il controller della vista nella classe stessa. Una volta che ho spostato il codice in 'initWithNibName', tutto ha funzionato alla grande. Ciò lo ha risolto perché '[storyboard instantiate ..]' chiama 'initWithCoder', evitando così il ciclo infinito ricorsivo. – Matthew

10

Crea bambino, durante la creazione di radice 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; 
} 

Aggiungere vista del bambino al momento della creazione di vista di root:

-(void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.news.view.frame = self.newsSection.bounds; 
    [self.newsSection addSubview:self.news.view]; 
} 
+0

La tua soluzione ha funzionato. Grazie. Mi chiedo, perché dovrei usare awakeFromNib invece della mia domanda modificata (ho aggiunto una soluzione temporanea) – Segev

+0

Su iOS <6 la vista può essere caricata/scaricata più di una volta, quindi ogni volta che viewDidLoad viene chiamato istanza di NewsViewController verrà creato e aggiunto da bambino. Naturalmente puoi gestire viewDidUnload e rimuoverlo lì, ma a mio parere la creazione di child quando crei genitore è migliore. –

1

Prova questo:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                bundle:nil]; 
NewsViewController *rootViewController = 
[storyboard instantiateViewControllerWithIdentifier:@"NewsViewControllerID"]; 
+0

Non mostrerà il ViewController su tutto lo schermo? Voglio mostrarlo solo su una parte dello schermo del controller della vista root – Segev

+1

Perché non crei solo una classe UIView invece di UIViewcontroller? Può essere aggiunto con 'addsubview:' metodo –

0

Si dovrebbe sposta il tuo codice su - (void) viewDidApp orecchio: (BOOL) animato come questo

- (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. 
} 

perché telaio e limiti nella viewDidLoad è {0,0} {0,0}

+0

Non funziona per me. – Segev

+0

puoi inserire NSLog (@ "% @", NSStringFromCGRect (self.newsSection.bounds)); dopo [super viewDidAppear: ...? – stosha

+0

2013-07-25 12: 54: 04.470 containerTests [6683: 11303] {{0, 0}, {320, 146}} – Segev

1

Ecco l'approccio il modo in cui ha funzionato per me.

Ho 3 pulsanti nella parte superiore Acquisto, vendita, noleggio. ora a toccare qualsiasi pulsante in particolare sto caricando UIViewController corrispondente e sto usando lo storyboard.

Ho specificato Storyboard Id per ogni UIViewController.

Ho aggiunto due UIView al mio Main ViewController che hanno questi 3 pulsanti (acquisto, vendita, noleggio).

una vista che sto usando per i tre pulsanti sopra e altri sto usando per caricare un UIViewController.

Ora toccando un pulsante specifico sono e toccando un pulsante specifico sto seguendo il codice seguente.

- (IBAction)sellingClicked:(id)sender 
{   
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 

    TestViewController *tvc=[storyboard instantiateViewControllerWithIdentifier:@"test"]; 

    [self.viewContainer addSubview:tvc.view]; 
    [self addChildViewController:tvc];  
} 

e il suo funzionamento perfettamente per me ulteriormente è possibile aggiungere lo scorrimento Visualizza che si desidera scorrere lì.

+1

Usa 'self.storyboard' invece di caricare l'intero storyboard. Questo risuccherà molta memoria e CPU. – Andy

1
 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); 

Non dimenticare di specificare vincolo, soprattutto se si desidera eseguire le animazioni

Problemi correlati