0

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) -

enter image description here

НО

в устройстве (iPhone 5, IOS 9.2) я не получил это на экране (даже панели вкладок находится в исходном состоянии - выбирается каждый сегмент) и на экране ничего -

enter image description here

Я отлаживаю каждый кадр детского представления контроллеров, печатные рамки подвид - все правильно. Что может вызвать эту проблему? Благодарю.

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 через провод каким-то образом.

+0

Код, который вы предоставили, ничего не говорит о проблеме, он должен быть где-то в другом месте. –

+0

@FahriAzimov - это все логика бизнеса. После некоторого исследования - я обнаружил, что когда я изменяю рамку нового контроллера представления, не добавляя его в качестве контроллера подсмотра или дочернего представления - вкладки переходят в исходное состояние со всеми выбранными вкладками! –

+0

Понятно, что вы устанавливаете выбранные изображения на вкладку на контроллерах viewDidLoad. Это основная проблема здесь, когда вы изменяете фрейм контроллера представления, который ранее не загружал его представление, он заставляет «viewDidLoad» вызываться, вот и все выбранные вкладки. –

ответ

0

И через 4 часа исследования я обнаружил следующее:

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

РЕЗЮМЕ

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

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