Контроллер дочернего вида не отображается на устройстве
Я разработал обычай UITabbarController
с моим собственным макетом вкладок. У меня есть набор UIViewController
, то, что я создаю из stroryboard, вот так:
class func instantiateMainViewControllers () -> Array<UIViewController>
{
var controllersArray = Array<UIViewController>()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let feedVC = storyboard.instantiateViewControllerWithIdentifier(BL_UIConst.kFeedControllerIdentifier)
controllersArray.append(feedVC)
let exploreVC = storyboard.instantiateViewControllerWithIdentifier(BL_UIConst.kExploreControllerIdentifier)
controllersArray.append(exploreVC)
let cameraVC = storyboard.instantiateViewControllerWithIdentifier(BL_UIConst.kCameraControllerIdentifier)
controllersArray.append(cameraVC)
let chatVC = storyboard.instantiateViewControllerWithIdentifier(BL_UIConst.kChatControllerIdentifier)
controllersArray.append(chatVC)
let profileVC = storyboard.instantiateViewControllerWithIdentifier(BL_UIConst.kProfileControllerIdentifier)
controllersArray.append(profileVC)
return controllersArray
}
А чем назначить для просмотра массив контроллеров моего кастома UITabbarController
, Переключение между контроллерами работает следующим образом (пользовательский контроллер панели вкладок имеет presentationView UIView
на нем для отображения дочернего контроллера):
private func displayViewController ( atIndex index : Int ) -> Void
{
let controller = viewControllersArray[index]
if ( presentationView.subviews.count > 0 )
{
let presentedView = presentationView.subviews[0]
for ( var i = 0 ; i < viewControllersArray.count ; i++ )
{
let localController = viewControllersArray[i]
if ( localController.view == presentedView )
{
localController.willMoveToParentViewController(nil)
localController.view.removeFromSuperview()
localController.removeFromParentViewController()
break
}
}
}
self.addChildViewController(controller)
controller.view.bounds = self.presentationView.bounds
controller.view.frame = CGRectMake(0.0, 0.0, presentationView.frame.size.width, presentationView.frame.size.height - 10)
presentationView.addSubview(controller.view)
}
И я делаю начальную настройку массива контроллеров (выбирая первый и вызывая процедуру displayViewController) в viewDidAppear
функция. Первый контроллер - это табличное представление.
Затем случается очень волшебная вещь. На симуляторе ( iPhone 6s, iOS 9.2 - на скриншоте есть небольшая проблема с авторазмещением - у вкладки все еще статический размер 320.0 и iPhone 5s, iOS 9.2) -
НО
На устройстве ( iPhone 5, iOS 9.2) это отображается на экране (даже панель вкладок находится в исходном состоянии - каждый сегмент выделен) и ничего на экране -
Я отлаживал каждый кадр дочерних контроллеров представления, печатал кадры подпредставлений - все правильно. Что может вызвать эту проблему? Благодарю.
РЕДАКТИРОВАТЬ
Я управляю панелью вкладок следующим образом. Он принадлежит к главному контроллеру панели вкладок. И этот контроллер имеет следующий метод конфигурации -
private func setUpTabBar ( forSelectedActionSignContainer imageView : UIImageView ) -> Void
{
var viewControllerIndex = 0
if ( imageView == feedSign )
{
feedSign.hidden = false
exploreSign.hidden = true
cameraSign.hidden = true
chatSign.hidden = true
profileSign.hidden = true
viewControllerIndex = 0
}
if ( imageView == exploreSign )
{
feedSign.hidden = true
exploreSign.hidden = false
cameraSign.hidden = true
chatSign.hidden = true
profileSign.hidden = true
viewControllerIndex = 1
}
if ( imageView == cameraSign )
{
feedSign.hidden = true
exploreSign.hidden = true
cameraSign.hidden = false
chatSign.hidden = true
profileSign.hidden = true
viewControllerIndex = 2
}
if ( imageView == chatSign )
{
feedSign.hidden = true
exploreSign.hidden = true
cameraSign.hidden = true
chatSign.hidden = false
profileSign.hidden = true
viewControllerIndex = 3
}
if ( imageView == profileSign )
{
feedSign.hidden = true
exploreSign.hidden = true
cameraSign.hidden = true
chatSign.hidden = true
profileSign.hidden = false
viewControllerIndex = 4
}
displayViewController(atIndex: viewControllerIndex)
}
Каждая вкладка на панели имеет свое собственное действие, а каждая зеленая линия внизу имеет свой выход:
@IBAction func feedControllerSelected()
{
setUpTabBar(forSelectedActionSignContainer: feedSign)
}
@IBAction func exploreControllerSelected()
{
setUpTabBar(forSelectedActionSignContainer: exploreSign)
}
@IBAction func cameraControllerSelected()
{
setUpTabBar(forSelectedActionSignContainer: cameraSign)
}
@IBAction func chatControllerSelected()
{
setUpTabBar(forSelectedActionSignContainer: chatSign)
}
@IBAction func profileControllerSelected()
{
setUpTabBar(forSelectedActionSignContainer: profileSign)
}
private func initialSetUp()
{
setUpTabBar(forSelectedActionSignContainer: feedSign)
}
И в viewDidAppear
контроллера вкладок я делаю начальную настройку, вызывая setUpTabBar(forSelectedActionSignContainer: feedSign)
, Таким образом, дочерние контролеры ничего не управляют, строка в оригинале UITabbarController
РЕДАКТИРОВАТЬ 2
Все это происходит на устройстве, когда я добавляю UITableView
на дочерний вид контроллера. Без этого - все работает. Кажется, что какое-то исключение возникает на устройстве, но оно не распространяется как-то по xcode по проводам.
1 ответ
И после 4 часов расследования я обнаружил следующее:
- Моя проблема воспроизводится, только если контроллер начального представления содержит табличное представление
- Не воспроизводится, если табличное представление содержит 0 строк
- Он по-прежнему воспроизводит по умолчанию
UITabbarController
- В моем
UITableViewCell
, конечно, пользовательский, у меня есть горизонтальный скроллер -HorizontalTableView
Форма GitHub. - После удаления все работает как шарм.
РЕЗЮМЕ
- Эта проблема определенно вызвана некоторым внутренним исключением UIKit, которое не вызывает его должным образом
- Воспроизводится только на реальных устройствах. В симуляторе такой проблемы нет
- Как Apple может сделать это в UIKit?! Ненавижу их всех! Готовьте, яблоко, xcode!
Спасибо всем!