I'v разработал пользовательский 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
. Переключение между контроллерами работает следующим образом (пользовательский контроллер TabBar имеет 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 - на скриншоте есть небольшая проблема autolayout - TabBar до сих пор статический 320,0 размер и iPhone 5s, IOS 9.2) -
НО
в устройстве (iPhone 5, IOS 9.2) я не получил это на экране (даже панели вкладок находится в исходном состоянии - выбирается каждый сегмент) и на экране ничего -
Я отлаживаю каждый кадр детского представления контроллеров, печатные рамки подвид - все правильно. Что может вызвать эту проблему? Благодарю.
EDIT
Я управляю панель вкладок в следующем образом. Он принадлежит основному контроллеру отображения панели. И что контроллер имеет следующий метод настройки -
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
контроллера TabBar я сделать начальное конфигурации по телефону setUpTabBar(forSelectedActionSignContainer: feedSign)
. Так ребенок контроллеры ничего, линии не удалось в оригинальной UITabbarController
EDIT 2
Все это происходит на устройстве, когда я добавляя UITableView
, чтобы увидеть ребенка контроллера. Без него все работает. Похоже, что какое-то исключение растет на устройстве, но оно не распространяется на xcode через провод каким-то образом.
Код, который вы предоставили, ничего не говорит о проблеме, он должен быть где-то в другом месте. –
@FahriAzimov - это все логика бизнеса. После некоторого исследования - я обнаружил, что когда я изменяю рамку нового контроллера представления, не добавляя его в качестве контроллера подсмотра или дочернего представления - вкладки переходят в исходное состояние со всеми выбранными вкладками! –
Понятно, что вы устанавливаете выбранные изображения на вкладку на контроллерах viewDidLoad. Это основная проблема здесь, когда вы изменяете фрейм контроллера представления, который ранее не загружал его представление, он заставляет «viewDidLoad» вызываться, вот и все выбранные вкладки. –