子视图控制器不会出现在设备上

Child View Controller don't appear on device

我用自己的标签栏布局开发了自定义 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)
}

并且我在 viewDidAppear 函数中对控制器数组进行了初始设置(选择第一个并调用 displayViewController 过程)。第一个控制器是 table 视图。

比这更神奇的事情发生了。在模拟器上(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。

经过 4 小时的调查,我发现了以下内容:

  1. 仅当启动视图控制器包含 table 视图
  2. 时,我的问题才会重现
  3. 它不会重现,如果 table 视图包含 0 行
  4. 它仍然以默认方式重现UITabbarController
  5. 在我的 UITableViewCell 中,肯定是自定义的,我有水平滚动条 - HorizontalTableView 形式 GitHub。
  6. 删除后一切如常。

摘要

  1. 这个问题肯定是由一些内部 UIKit 异常引起的,没有正确引发它
  2. 它在真实设备上重现。在模拟器中没有这个问题
  3. Apple 怎么能在 UIKit 中做到这一点?!讨厌他们!库克,苹果,xcode!

谢谢大家!