2015-07-20 3 views
0

У меня есть UIViewController с UITabBar наверху. Я не использую UITabBarController, потому что мне нужен UITabBar наверху, а не внизу. Вот мой текущий контроллер вид:Текущий контроллер представления, в то время как контроллер текущего вида имеет UITabBar, но нет UITabBarController

class CustomTabBarController: UIViewController, UITabBarDelegate 
{ 
    @IBOutlet weak var tabBar: UITabBar! 
    var viewControllers: [UIViewController] = [] 

    //MARK: UIVIewController delegate 
    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     //TabBarController 
     let storyboard = UIStoryboard(name: "Main", bundle: nil) 

     self.viewControllers.append(storyboard.instantiateViewControllerWithIdentifier("myWorldViewController") as UIViewController) 
     self.viewControllers.append(storyboard.instantiateViewControllerWithIdentifier("meViewController") as UIViewController) 
     self.viewControllers.append(storyboard.instantiateViewControllerWithIdentifier("welcomeViewController") as UIViewController) 
     self.tabBar.selectedItem = self.tabBar.items?.first 


     //Graphical Settings 
     let itemWidth = self.tabBar.frame.width/3 as CGFloat 
     let image = self.imageWithColor(UIColor.grayColor(), size: CGSizeMake(itemWidth, 49)) 

     UITabBar.appearance().barTintColor = UIColor.whiteColor() 
     UITabBarItem.appearance().setTitleTextAttributes([NSFontAttributeName:UIFont(name: "Helvetica Neue", size: 20)!], forState: UIControlState.Normal) 
     UITabBarItem.appearance().titlePositionAdjustment = UIOffset(horizontal: 0, vertical: -10) 
     UITabBar.appearance().tintColor = UIColor.whiteColor() 
     UITabBar.appearance().selectionIndicatorImage = image 

     //Borders 
     self.tabBar.layer.borderColor = UIColor.grayColor().CGColor 
     self.tabBar.layer.borderWidth = 1 

     self.tabBar(self.tabBar, didSelectItem: (self.tabBar.items?.first)!) 
    } 

    func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) 
    { 
     self.view.insertSubview(self.viewControllers[item.tag].view, belowSubview: self.tabBar) 
    } 

    override func didReceiveMemoryWarning() 
    { 
     super.didReceiveMemoryWarning() 
    } 

    //MARK: Utils 
    func imageWithColor(color: UIColor, size: CGSize) -> UIImage 
    { 
     let rect = CGRectMake(0, 0, size.width, size.height) 
     UIGraphicsBeginImageContext(size) 
     let context = UIGraphicsGetCurrentContext() 
     CGContextSetFillColorWithColor(context, color.CGColor) 
     CGContextFillRect(context, rect) 
     let image: UIImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return image 
    } 
} 

Что мне сейчас нужно, это представить контроллер представления при нажатии на кнопку в одном из видов вкладок. На контроллере назначения мне нужно сохранить UITabBar (например, при использовании обычного UITabBarController). Как я могу это сделать ?

ответ

2

Вы хотите create a custom Container View Controller. Ваш CustomTabBarController должен быть контроллером родительского контроля контроллеров вида для каждой вкладки. Это будет тот, который отвечает за отображение UITabBar и представление выбранного контроллера детского представления ниже.

Попробуйте включения ниже код в ваш класс:

let contentView = UIView() 
var selectedViewController: UIViewController? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    view.addSubview(contentView) 

    // ... rest of your code 
    // + layout of contentView to take up the area below tabBar 
} 

func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) { 
    if let currentVC = selectedViewController { 
     currentVC.willMoveToParentViewController(nil) 
     currentVC.view.removeFromSuperview() 
     currentVC.removeFromParentViewController() 
    } 
    let newVC = viewControllers[item.tag] 
    addChildViewController(newVC) 
    contentView.addSubview(newVC.view) 
    newVC.view.frame = contentView.bounds 
    newVC.didMoveToParentViewController(self) 
    selectedViewController = newVC 
} 
+0

Спасибо за ваш ответ. Я проверю ссылку, которую вы предоставили, чтобы узнать больше о контроллерах Container View, чтобы я не только копировал код, не зная, что я делаю. Я помету ваш ответ как «Принято», как только я попробую это. – Aeradriel

+0

После этого кода у меня все еще есть такая же проблема, когда я пытаюсь нажать новый контроллер просмотра с помощью кнопки в подвью, панель вкладок «стирается». Действительно, на этом уровне взаимодействия с панелью вкладок нет. Есть ли способ уведомить Контейнер о том, что мы хотим подтолкнуть новый VC? (без использования NSNotification) – Aeradriel

+1

Вы можете пересечь свойства 'parentViewController' /' presentingViewController', чтобы найти 'CustomTabBarController'. Или, если CustomTabBarController - это контроллер корневого представления ваших приложений, вы можете получить к нему доступ, используя '[UIApplication sharedApplication] .keyWindow.rootViewController'. Использование уведомлений тоже отлично. Что подходит вам, зависит от вашей общей архитектуры. – jaetzold

Смежные вопросы