Подтвердить что ты не робот

Как добавить представление UIViewController в качестве подзадачи

Примечание для гуглеров, этот Q-A теперь истекает на шесть лет!

Как упоминает Микки ниже и другие, это делается на ежедневной основе с помощью Контейнеров в iOS.


У меня есть ViewController, который контролирует многие подзаголовки. Когда я нажимаю одну из кнопок, я инициализирую другой диспетчер представлений и показываю его как подпункт этого представления. Однако subview превышает границы кадра для subview, а infact заполняет весь экран.

Что может быть неправильным? Я предполагаю, что проблема заключается в том, что представление UIViewController имеет фрейм (0,0,320,460) и, следовательно, заполняет весь экран (хотя он получает события касания только при касании в границах рамки подсмотра). Как изменить размер рамки в соответствии с подвью.

Вкратце, мне нужна помощь в добавлении представления viewcontroller в качестве подчиненного представления в другое представление viewcontroller.

Спасибо!

4b9b3361

Ответ 1

Начиная с iOS 5, Apple теперь позволяет вам делать пользовательские контейнеры с целью добавления UIViewController к другому UIViewController, особенно с помощью таких методов, как addChildViewController, так что действительно возможно вложить UIViewControllers

РЕДАКТИРОВАТЬ: Включая резюме на месте, чтобы избежать разрыва связи

Я цитирую:

iOS предоставляет множество стандартных контейнеров, которые помогут вам организовать ваши приложения. Однако иногда вам нужно создать собственный рабочий процесс, который не соответствует тому, который предоставляется в любом из системных контейнеров. Возможно, в вашем видении ваше приложение нуждается в определенной организации контроллеров детского просмотра со специальными движениями навигации или переходами между ними. Для этого вы реализуете пользовательский контейнер - Скажите подробнее...

... и:

При создании контейнера вы создаете явные отношения между родителями и дочерними элементами между вашим контейнером, родительским и другими контроллерами представлений, его дочерние элементы - Скажите мне больше

Пример (любезно предоставлен документацией Apple) Добавление другого представления контроллеров в иерархию представлений контейнеров

- (void) displayContentController: (UIViewController*) content
{
   [self addChildViewController:content];                 
   content.view.frame = [self frameForContentController]; 
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          
}

Приветствия,

Микки Дункан

Ответ 2

Благодаря этим парням я сделал это http://highoncoding.com/Articles/848_Creating_iPad_Dashboard_Using_UIViewController_Containment.aspx

Добавьте UIView, подключите его к заголовку:

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;

В - (void) viewDidLoad выполните следующее:

ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
    nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
    [self.addViewToAddPlot addSubview:nonSystemsController.view];
    [self addChildViewController:nonSystemsController];
    [nonSystemsController didMoveToParentViewController:self];

Enjoy

Ответ 3

Этот ответ верен для старых версий iOS, но теперь он устарел. Вы должны использовать ответ Микки Дункана, который охватывает пользовательские контейнеры.

Не делай этого! Цель UIViewController - управлять всем экраном. Это просто не подходит для этого, и на самом деле это не добавляет ничего, что вам нужно.

Все, что вам нужно, это объект, которому принадлежит пользовательский вид. Просто используйте подкласс самого UIView, поэтому его можно добавить в вашу иерархию окон, а управление памятью полностью автоматическое.

Направьте подчиненному владельцу NIB пользовательский подкласс UIView. Добавьте выход contentView к этому пользовательскому подклассу и наведите его на представление внутри наконечника. В пользовательском подклассе сделайте что-то вроде этого:

- (id)initWithFrame: (CGRect)inFrame;
{
    if ( (self = [super initWithFrame: inFrame]) ) {
        [[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
                                      owner: self
                                    options: nil];
        contentView.size = inFrame.size;
        // do extra loading here
        [self addSubview: contentView];
    }
    return self;
}

- (void)dealloc;
{
    self.contentView = nil;
    // additional release here
    [super dealloc];
}

(Я предполагаю, что вы используете initWithFrame: для построения подвью.)

Ответ 4

Я чувствую, что все эти ответы немного неполны, поэтому здесь правильный способ добавления viewController view в качестве подзапроса другого представления viewController:

    [self addChildViewController:viewControllerToAdd];
    [self.view addSubview:viewControllerToAdd.view];
    [viewControllerToAdd didMoveToParentViewController:self];

Если вы хотите, вы можете скопировать его в свой код в виде фрагмента. SO, похоже, не понимает форматирование замены кода, но они будут отображаться в Xcode:

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];

willMove вызывается автоматически w/addChild. Спасибо @iOSSergey

Когда ваш пользовательский контейнер вызывает метод addChildViewController: он автоматически вызывает метод willMoveToParentViewController: метод контроллера представления, который будет добавлен в качестве дочернего элемента, прежде чем добавлять его.

Ответ 5

Использование:

[self.view addSubview:obj.view];

Ответ 6

Измените размер кадра viewcontroller.view.frame, а затем добавьте в subview. [viewcontrollerparent.view addSubview:viewcontroller.view]

Ответ 7

Вы должны установить свойства границ для этого фрейма. кадр его свойств супервизора, а границы ограничивают рамку в самой системе координат представления.