2013-08-14 3 views
7

Я могу создать UINavigationController с пользовательскими классами баров, используя initWithNavigationBarClass:toolbarClass:. Кажется, что не существует эквивалента для UITabBarController, так как я могу использовать его для использования класса UITabBar?Как создать UITabBarController с пользовательским классом UITabBar без использования IB?

Каждое решение, которое я видел до сих пор не подходит, потому что либо

  1. Он использует IB
  2. Он добавляет вторую панель вкладок в UITabBarController вместо изменения его существующего или
  3. Он кидает UITabBarController и делает новый класс контроллера.

Я хочу реальный UITabBarController, созданный в коде с использованием пользовательского класса для панели вкладок. Как мне это достичь?

ответ

5

Это удивительно сложно! Лучшее, что я придумал это подклассов UITabBarController, а затем делать это в init:

super.init(nibName: nil, bundle: nil) 

object_setClass(self.tabBar, CustomTabBar.self) 
(self.tabBar as? CustomTabBar)?.setup() 

К сожалению, вы не можете установить класс перед вызовом super.init (не в Swift так или иначе), и поэтому самая время, когда вы меняете класс, метод init уже запущен и поэтому не будет вызываться в вашем пользовательском подклассе. Чтобы обойти эту проблему, я просто добавил setup() способ сделать все мои настройки в

Другой вариант в Swift является расширение UITabBar и сделать что-то вроде этого:.

extension UITabBar { 

    open override func willMove(toSuperview newSuperview: UIView?) { 
     super.willMove(toSuperview: newSuperview) 
     /// Customise in here. 
    } 

    // Modify the height. 
    open override func sizeThatFits(_ size: CGSize) -> CGSize { 
     return CGSize(width: size.width, height: 64.0) 
    } 
} 

Однако это будет влиять на все экземпляры UITabBar, поэтому я предпочитаю первый вариант.

1

Я не думаю, что это возможно.

Здесь представлена ​​документация Apple, в которой говорится о собственности tabbar от UITabBarController.

Вы не должны пытаться манипулировать самим объектом UITabBar , хранящимся в этом объекте. Если вы попытаетесь сделать это, на панели табуляции выдается исключение. Чтобы настроить элементы для панели вкладок , вы должны назначить один или несколько настраиваемых контроллеров вида для свойства viewControllers. Панель вкладок собирает необходимые элементы табуляции из указанных вами контроллеров вида.

Вид панели вкладок, предоставляемый этим свойством, предназначен только для ситуаций , где вы хотите отобразить лист действий, используя метод showFromTabBar: класса UIActionSheet.

0

Насколько я знаю, вы не можете этого сделать. Ваш лучший способ сделать это без IB - иметь собственный UIViewController (не подклассифицировать UITabBarController), а затем добавить свой собственный подкласс UITabBar к этому контроллеру.

Вы также можете просмотреть иерархию контроллера, если вы решите следовать этому подходу.

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