2013-05-03 2 views
2

Я раскадровку: myStoryBoardКак программно добавить ChildVC?

Как вы можете видеть, у меня есть MenuViewController: UIViewController с контейнером. Контейнер MenuTableViewController: UITableViewController с MenuTableView: UITableView.

Что я хочу сделать, это изменить размер моего контейнера (MenuTableViewController) и добавить еще одного Ребенка в мой mainVC.

добавить его в MenuViewController:

-(void)viewDidAppear:(BOOL)animated { 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil]; 
    MenuTableViewController* secondChildVC = [sb instantiateViewControllerWithIdentifier:@"MenuTableViewController"]; 
    [secondChildVC.view setBackgroundColor:[UIColor redColor]]; 
    [self addChildViewController:secondChildVC]; 
    NSLog(@"MenuTableViewController.view info: %@",secondChildVC.view); 
    NSLog(@"secondChildVC views: %@",[secondChildVC.view subviews]); 

    MenuTableViewController *firstChildVC = [self.childViewControllers objectAtIndex:0]; 
    [firstChildVC.view setFrame:CGRectMake(160, 0, 160, 504)]; 
    [firstChildVC.view setBackgroundColor:[UIColor greenColor]]; 
    NSLog(@"firstChildVC views: %@",[firstChildVC.view subviews]); 

} 

И это мой журнал:

MenuTableViewController.view info: <MenuTableView: 0x8910e00; baseClass = UITableView; frame = (0 20; 320 548); clipsToBounds = YES; opaque = NO; autoresize = W+H; gestureRecognizers = <NSArray: 0x761eca0>; layer = <CALayer: 0x76202b0>; contentOffset: {0, 0}> 
2013-05-03 17:20:10.796 TestStories[41780:c07] secondChildVC views: (
    "<UIImageView: 0x76205e0; frame = (0 541; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7620680>>", 
    "<UIImageView: 0x7620740; frame = (313 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x76207e0>>" 
) 
2013-05-03 17:20:10.798 TestStories[41780:c07] firstChildVC views: (
    "<UITableViewCell: 0x7143110; frame = (0 320; 160 320); autoresize = W; layer = <CALayer: 0x713cc10>>", 
    "<UITableViewCell: 0x7140b90; frame = (0 0; 160 320); autoresize = W; layer = <CALayer: 0x7140ce0>>", 
    "<UIImageView: 0x7135000; frame = (0 497; 320 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x71351b0>>", 
    "<UIImageView: 0x7135270; frame = (153 517; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7135310>>" 
) 

Почему мой secondChildVC не содержит TableViewCells? Без понятия.

Вы можете видеть, что я использую красные и зеленые цвета для фона (красный для secondChildCV). Но, вероятно, никогда не появляется. Вот скриншот: enter image description here

+1

Я ответил на вопрос, который вы задали, но почему вы хотите добавить второго ребенка в код? Поскольку вы делаете это в viewDidAppear, это сразу появится, так почему бы не просто сделать 2 вида контейнера в раскадровке в первую очередь? – rdelmar

+0

Я хочу решить, сколько контейнеров у меня будет во время выполнения. Поэтому я не могу создать его в раскадровке. Это скорее скорее прототип контейнера, чем конечный продукт. Конечно, если эта идея ... хммм ... нехорошо, я открыт для предложения, как сделать ее лучше :) – Kuba

ответ

12

Я думаю, что вы делаете пару вещей неправильно. Контроллер дочернего представления будет иметь тот же размер, что и представление контейнера, поэтому вы должны иметь IBOutlet для представления контейнера и изменять его размер, а не изменять размер контроллера дочернего представления.

Для второго ребенка вы добавляете его в качестве ребенка, но вы никогда не добавляете его вид в представление MenuViewController. Вы также должны вызвать didMoveToParentViewController сразу после добавления его в качестве дочернего. Так что вам нужно сделать что-то вроде:

MenuTableViewController* secondChildVC = [self.storyboard instantiateViewControllerWithIdentifier:@"MenuTableViewController"]; 
    [secondChildVC.view setBackgroundColor:[UIColor redColor]]; 
    [self addChildViewController:secondChildVC]; 
    [secondChildVC didMoveToParentViewController:self]; 
    secondChildVC.view.frame = CGRectMake(0,0,160,504); 
    [self.view addSubview:secondChildVC.view]; 

Обратите внимание также, что вы можете более просто получить ссылку на раскадровке с self.storyboard

+0

Спасибо! Это очень полезно. Но еще один вопрос. Я хочу сделать это во время выполнения, поэтому, если я изменю размер контейнера, я могу создать еще один рядом с firstone? – Kuba

+0

@SimpleMan Вы намерены использовать автоматическую компоновку, как это было предложено вашими снимками экрана, или вы собираетесь отключить это? – Rob

+1

Я собираюсь отключить его. – Kuba

2

Я согласен с rdelmar относительно программной пользовательских контейнерных вызовов.

Я также заметил, что вы используете автоматический макет (только iOS 6+), поэтому вы не можете просто изменить frame видов больше. Вы действительно должны изменять ограничения. Вам нужен автоматический макет? Если нет, выключите его. И у вас есть, чтобы отключить его, если вы хотите поддерживать версии iOS до 6.0.

Если вы остаетесь с автозапуском, вы должны создать IBOutlet для соответствующего ограничения, а затем использовать константу этого ограничения для изменения макета. Невероятно легко изменить размеры UIView.

Принимая это еще один шаг, программное добавление представления в сцену автозапуска может быть затруднительным, чтобы получить все ограничения. Честно говоря, я думаю, что гораздо проще поставить два контейнера на сцену (по одному для каждого детского вида) с самого начала, но в основном скрыть его, установив его ширину на ноль. Вы можете эффективно установить свои ограничения (описывая его в VFL) @"|[container1][container2]|", а затем установить ширину скрытой, чтобы она была равна нулю. Затем, когда вы хотите показать скрытый контейнер, установите константу ограничения ширины так, как хотите. Когда вы это сделаете, это автоматически изменит размер обоих контейнеров.

+0

Спасибо, ты прав. Я использую autolayout, но я не думаю, что мне это понадобится в моем приложении. Проблема здесь в том, что я не могу сделать это в раскадровке, потому что хочу решить, сколько табличных представлений появляется в VC во время выполнения. – Kuba

+1

@SimpleMan Понял. Отключите автозапуск, и логика настройки 'frame' должна работать так, как вы ожидаете. Автовыключение часто препятствует попыткам вручную установить свойства «frame». Вы можете сделать это в автоматическом макете, но это просто отличный чайник. – Rob

+0

Спасибо! Но из любопытства .. Если я хочу придерживаться автозапуска, мне нужно отредактировать ограничения из кода, верно? Есть единственный способ? – Kuba

Смежные вопросы