2016-11-24 2 views
2

У меня есть контроллер просмотра страниц, который переходит между контроллерами представлений, используя обычные методы UIPageViewController. Внутри одного из представленных контроллеров зрения (скажем, текущий контроллер вида), добавить контроллер представления ребенка в подвид называется containerView как так:Представление контроллера детского представления внутри текущей страницы UIPageController

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let child = storyboard.instantiateViewController(withIdentifier: "child") 
    self.addChildViewController(child) 
    child.view.frame = self.containerView.bounds 
    self.containerView.addSubview(child.view) 
    child.didMove(toParentViewController: self) 

Контроллер вид представлен внутри containerView, однако это только пол-интерактивный. Например, предположим, что контроллер дочернего представления имеет ползунок, который обновляет метку со значением ползунка. При перемещении ползунка слайдер будет визуально перемещаться внутри containerView, но не будет обновлять этикетку (IBAction, подключенный к ползунку, не запускается). Это поведение работало правильно, когда контроллер представления был представлен нормально (полноэкранный режим с использованием обычного режима).

Любые идеи?

+0

это очень странно ... так что в отладке метод делегата вашего слайдера-изменен не вызывается? –

+0

на самом деле он срабатывает, однако метка не обновляется. Я поставил точку останова в слайдере IBAction и получил вызов, но текст ярлыка не изменяет 'label.text = String (slider.value)', как это происходит, когда контроллер представления представлен нормально. Я даже попытался изменить цвет фона 'self.view', и это работает правильно, просто чтобы увидеть, если это сработало. –

+0

Вам нужно описать ситуацию в _much_ больше p подробно изложите, чтобы получить хороший ответ. В противном случае вы просто теряете репутацию, которую вы только что потратили на щедрость. Трудно сказать, в чем проблема. Однако обратите внимание, что связь между несколькими уровнями контроллера контроллера (просмотр в контроллере представления в контроллере родительского представления) - очень сложная проблема! У меня есть длинное обсуждение вариантов здесь, которые могут дать вам некоторые идеи: http://stackoverflow.com/a/33458977/341994 – matt

ответ

0

Кажется, что что-то происходит с контроллерами представления раскадровки, так как я смог удалить слайдер и добавить новый слайдер, а функциональность работала правильно на странице UIPageViewController.

0

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

child.view.frame = self.containerView.bounds 
self.containerView.addSubview(child.view) 
// need to add constraint, because if container view resized, child view frame not changed 
child.view.autoresizinkMask = [.flexibleHeight, .flexibleWidth] 
child.view.translatesAutoresizingMaskIntoConstraints = true 
child.didMove(toParentViewController: self)