2012-10-28 2 views
2

Я пытаюсь представить UIViewController внутри UIPopoverController. Я разработал контроллер представления в Interface Builder, дал ему пользовательский класс (скажем MyAppTestViewController), и я пытаюсь создать поповер таким образом:Отображение UIViewController внутри UIPopoverController

MyAppTestViewController *fxViewController = [MyAppTestViewController new]; 

self.fxPopover = [[UIPopoverController alloc] initWithContentViewController:fxViewController]; 
self.fxPopover.popoverContentSize = CGSizeMake(1024, 120); 

[self.fxPopover presentPopoverFromBarButtonItem:_fxButton permittedArrowDirections:UIPopoverArrowDirectionDown animated:NO]; 

При нажатии на кнопку, появится поповер в правильном месте с правильным размером, но он пуст. Я проверил, что MyAppTestViewController «s viewDidAppear метод вызывается (по NSLog), но внутри поповер является пустым:

ipad screenshot

ли я что-то отсутствует?

ответ

2

Я вижу, что вы упомянули в комментарии, что используете раскадровку. Так почему бы не использовать popover segue для вашего MyAppTestViewController? Вы можете подключить segue непосредственно к кнопке «Эффекты» на панели инструментов. (Или, альтернативно, вызовите performSegueWithIdentifier: с вашего контроллера представления.) Вы можете сделать быстрый тест, просто выбросив UILabel в MyAppTestViewController прямо на раскадровку и посмотреть, правильно ли он отображается.

enter image description here

+0

Я думал о трудном пути, я не знаю почему. это сработало отлично. благодаря –

1

Я думаю, что проблема здесь:

MyAppTestViewController *fxViewController = [MyAppTestViewController new]; 

Как правило, вы бы использовать [[MyViewControllerClass alloc] initWithNibName:nil bundle:nil] (если у вас есть XIb файл с соответствующим именем). Я не верю, что когда-либо видел контроллер представления, инициализированный new. Все в Objective-C является alloc-init.

компании Apple Docs: UIViewController Class Reference

Цитата:

Для инициализации объекта вида контроллера, используя перо, вы используете initWithNibName: расслоение: метод, чтобы указать файл острия, используемый контроллер просмотра , Затем, когда диспетчеру просмотра необходимо загрузить свои , он автоматически создает и настраивает представления, используя информацию , хранящуюся в файле nib.


EDIT:

Захватывающий, ну ладно. Похоже, вы правы в использовании нового ключевого слова, here is bit of an explanation of this.

Так хорошо, это не проблема. Вы пытались взломать метод viewDidAppear и использовать отладчик для печати свойств вида, проверить его фрейм, проверить его супервизор и т. Д., Попытаться лучше понять проблему? Возможно, вы уже знаете, как это сделать, но команды будут po self.view и так далее.

В любом случае, я также нашел this, хотя он входит только в механику презентации popover, а не для представления содержимого, которое, похоже, у вас нет.

+0

нет, я уже инициализацию множество контроллеров отображения с 'new' с успехом, это просто сокращение для Alloc-инициализации. я не использую отдельный наконечник, это контроллер вида из моего раскадровки. –

+0

ссылка, которую вы предоставили в конце, действительно полезна, спасибо. я, наконец, решил реализовать визуализацию управления popover, представив popper segue, как ответил Jay Slupesky. я нахожу визуальный дизайн чистым и стараюсь избегать кода при проектировании как можно больше .. спасибо за ссылку в любом случае. –