Контроллер дочернего вида не отображается на устройстве

Я разработал обычай 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 часов расследования я обнаружил следующее:

  1. Моя проблема воспроизводится, только если контроллер начального представления содержит табличное представление
  2. Не воспроизводится, если табличное представление содержит 0 строк
  3. Он по-прежнему воспроизводит по умолчанию UITabbarController
  4. В моем UITableViewCell, конечно, пользовательский, у меня есть горизонтальный скроллер - HorizontalTableView Форма GitHub.
  5. После удаления все работает как шарм.

РЕЗЮМЕ

  1. Эта проблема определенно вызвана некоторым внутренним исключением UIKit, которое не вызывает его должным образом
  2. Воспроизводится только на реальных устройствах. В симуляторе такой проблемы нет
  3. Как Apple может сделать это в UIKit?! Ненавижу их всех! Готовьте, яблоко, xcode!

Спасибо всем!

Другие вопросы по тегам