【发布时间】:2016-02-03 11:15:10
【问题描述】:
我使用自己的标签栏布局开发了自定义UITabbarController。我有一组UIViewController,我像这样从故事板实例化:
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 过程)。第一个控制器是一个表格视图。
发生了一件非常神奇的事情。在模拟器上(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。
【问题讨论】:
-
您提供的代码没有说明任何问题,它必须在其他地方。
-
@FahriAzimov - 这就是商业逻辑。经过一番调查 - 我发现当我修改新视图控制器的框架而不将其添加为子视图或子视图控制器时 - 选项卡滚动到初始状态并选中所有选项卡!
-
我明白了,然后您将所选图像设置为视图控制器
viewDidLoad上的标签栏。这是这里的主要问题,当您修改之前未加载其视图的视图控制器的框架时,它会强制调用viewDidLoad,这就是所有选项卡被选中的地方。 -
@FahriAzimov - 不完全是。查看我的答案的编辑
标签: ios uitabbarcontroller ios-simulator uitabbar childviewcontroller