子视图控制器不会出现在设备上
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 小时的调查,我发现了以下内容:
- 仅当启动视图控制器包含 table 视图
时,我的问题才会重现
- 它不会重现,如果 table 视图包含 0 行
- 它仍然以默认方式重现
UITabbarController
- 在我的
UITableViewCell
中,肯定是自定义的,我有水平滚动条 - HorizontalTableView
形式 GitHub。
- 删除后一切如常。
摘要
- 这个问题肯定是由一些内部 UIKit 异常引起的,没有正确引发它
- 它在真实设备上仅重现。在模拟器中没有这个问题
- Apple 怎么能在 UIKit 中做到这一点?!讨厌他们!库克,苹果,xcode!
谢谢大家!
我用自己的标签栏布局开发了自定义 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 小时的调查,我发现了以下内容:
- 仅当启动视图控制器包含 table 视图 时,我的问题才会重现
- 它不会重现,如果 table 视图包含 0 行
- 它仍然以默认方式重现
UITabbarController
- 在我的
UITableViewCell
中,肯定是自定义的,我有水平滚动条 -HorizontalTableView
形式 GitHub。 - 删除后一切如常。
摘要
- 这个问题肯定是由一些内部 UIKit 异常引起的,没有正确引发它
- 它在真实设备上仅重现。在模拟器中没有这个问题
- Apple 怎么能在 UIKit 中做到这一点?!讨厌他们!库克,苹果,xcode!
谢谢大家!