2016-02-19 4 views
0

создать новый подвидSWIFT: не может нажать на подвид

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    controller = storyboard.instantiateViewControllerWithIdentifier("menu") as! MenuViewController 
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 
    mainView.addSubview(controller.view) 
    controller.view.layer.zPosition = 1 
    controller.viewDidLoad() 

я добавить кнопку на ViewController

Но я не могу нажать на кнопку ...

Я могу выбрать текст, который находится под моим новым контроллером (добавить фотографии)

enter image description here

+0

Почему вы устанавливаете 'zPosition? 'Добавление его в качестве подзапроса автоматически приведет его к передней панели. –

+0

И почему вы делаете все эти вещи вручную? –

+0

без zPosition не работает:/ –

ответ

0

Немного проблем, связанных с вашим кодом.

Во-первых, вам не нужно, насколько я могу судить, из ограниченного объема вашего кода, вам не нужно устанавливать свойство zPosition слоя на все, кроме значения по умолчанию, равного нулю. Используя addSubview, добавление, которое вы добавляете, автоматически добавляется в начало всех текущих подзаголовков.

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

controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 

В-третьих, нет необходимости вручную запускать controller.viewDidLoad(), как он вызывается автоматически, как только его рама была установлена.

В-четвертых (!) Вы устанавливаете рамку представления, которая должна быть скрыта в верхней части экрана. Я не уверен, что это правильная функциональность, но хотелось бы убедиться, что вы знаете, что, устанавливая начало координат представления, равное значению рамки, нижняя часть представления будет выровнена с вершиной его надзора.

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

См. https://www.objc.io/issues/1-view-controllers/containment-view-controller/ для получения дополнительной информации.

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

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
if let controller = storyboard.instantiateViewControllerWithIdentifier("menu") as? MenuViewController { 
    controller.view.frame = CGRectMake(0, -150, self.view.frame.size.width, 150); 
    // Frame may need to be modified to be made visible^
    addChildViewController(controller) 
    controller.willMoveToParentViewController(self) 
    mainView.addSubview(controller.view) 
    controller.widMoveToParentViewController(self) 
} 
+0

Один маленький придир: 'viewDidLoad()' вызывается после загрузки вида, независимо от того, является ли представление на экране. Вызов 'controller.view.frame' приведет к запуску' viewDidLoad() ', даже до того, как' controller.view' будет добавлен как subview. –

+0

@AaronBrager Да, вы правы! Я обновил ответ. –

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