关于UITabBar

关于UITabBar
btn只代表一个按钮,(按钮这里提到两种UIButon和UIBarItem,这里多指UIBarItem)
UIBarItem和UIbutton有类似的功能的一个另类的btn

UITabBar类是一个View,被UITabBarControler的tabBar(只读属性)强引用.(类似UItableViewController和默认的UItableView的关系).

UITabBar内部btn(...item另类的btn,和btn类似但不同),由UITabBarControler.subviewController的(...item,另类btn)传入保存到一个强引用数组就是btn了(子控件的tabbarItem就是一个包装的btn控件,,另外这个Item是继承UIControl的所以,可以把这个Item强转为UIControl类型,然后用UIControl的addTarget监听按钮的点击)

btn的点击事件产生,由UITabBar监听,并调用UITabBar.delegate的响应方法,切换UITabBarControler相应的子控制器(这个监听并非是继承子UIControl的addTarget,因为addTarget只能有一个目标监听者,覆盖了就没了,但是实际上可以使用把这个Item强转为UIControl类型,然后用UIControl的addTarget监听按钮的点击,所以猜测可能是通知或其它方式)


UITabBar的代理默认是UITabBarControler(类似UItableViewController和默认的UItableView.delegate的关系)如图


当UITabBarControler.tabBar.delegate被重新赋值的时候,会抛出一个异常如图
但自定义的UITabBar的代理是可以随便设置的..
当自定义的UITabBar成为了UITabBarControler.tabBar的时候,它的代理就不能被改变了
猜测
UITabBarControler.tabBar应该被重写了UITabBar.delegate的setter方法(类似KVO监听原理).

另外UITabBarControler的代理UITabBarControler.delegate可以随意设置,并且代理方法中有可以监听UITabBarControler的子控制器切换的方法.
自定义一个UIView代替UITabBar就要设置数组存item_btn,写代理协议监听按钮点击,UIView的代理设为控制器,控制器实现代理方法,切换自己的子控制器,切换方法如图(详细的看彩票的项目第一天)

![image](屏幕快照 2015-11-25 11.56.28.png)
![image](屏幕快照 2015-11-25 11.57.28.png)
![image](屏幕快照 2015-11-25 12.08.36.png)

nav和tab中的bar和Item的区别

两边的bar都是一个类UIView的容器

tab的Item是一个相对bar独立的另类的btn(和toolBar中的Item是一样的UIBarItem)
tab的Item是由自控制器的Item,另类的btn(和toolBar中的Item是一样的)传人保存的
每一个子控制器对应一个Item所以独立, UITabBarItem : UIBarItem 
当然子控制器的tabbarItem属性是TabbarControl中定义的UIViewControl的分类中添加的

nav的Item是定义在navBar中的,并非是独立的,
nav的Item是navBar内部已经订好的,需要时懒加载的,每个子控制器对应一个Bar中所有的Item而不是一个Item,和title(lable的字符串数据)等,所以子控制器的UINavigationItem : NSObject只是一个类似数组的数据库,包含所有按钮.
当然子控制器的navbarItem属性是TabbarControl中定义的UIViewControl的分类中添加的
navBar中并非只有Item按钮,navBar由navC控制,navItem由子控制器控制
navBar和navItem又相对分开,和独立,各自有各自领域
  • self.navigationItem.rightBarButtonItem....(定义在navBar.h中),self.navigationItem子控制器的控制下的各种按钮继承自UIBarButtonItem,UIBarButtonItem继承自UIBarItem
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *leftBarButtonItems NS_AVAILABLE_IOS(5_0);
@property(nullable,nonatomic,copy) NSArray<UIBarButtonItem *> *rightBarButtonItems NS_AVAILABLE_IOS(5_0);
- (void)setLeftBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);
- (void)setRightBarButtonItems:(nullable NSArray<UIBarButtonItem *> *)items animated:(BOOL)animated NS_AVAILABLE_IOS(5_0);

/* By default, the leftItemsSupplementBackButton property is NO. In this case,
 the back button is not drawn and the left item or items replace it. If you
 would like the left items to appear in addition to the back button (as opposed to instead of it)
 set leftItemsSupplementBackButton to YES.
 */
@property(nonatomic) BOOL leftItemsSupplementBackButton NS_AVAILABLE_IOS(5_0);

// Some navigation items want to display a custom left or right item when they're on top of the stack.
// A custom left item replaces the regular back button unless you set leftItemsSupplementBackButton to YES
@property(nullable, nonatomic,strong) UIBarButtonItem *leftBarButtonItem;
@property(nullable, nonatomic,strong) UIBarButtonItem *rightBarButtonItem;
- (void)setLeftBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;
- (void)setRightBarButtonItem:(nullable UIBarButtonItem *)item animated:(BOOL)animated;
tabBarItem:UIBarItem
navBarItem.xxBarButtonItem:UIBarButtonItem:UIBarItem

UIBarItem和UIbutton有类似的功能的一个另类的btn
UIBarButtonItem中有这样一个方法在Item中包装一个View,可以包装一个UIbutton
- (instancetype)initWithCustomView:(UIView *)customView;


UITooBar中的Item是UIBarButtonItem,是UIBarButtonItem可以用自定义View,就是可以包装一个UIButton,,Xib中的UITooBar,可以拖UIButton等View,XIb自动包装成UIBarButtonItem

![image](屏幕快照 2015-11-25 15.31.38.png)
![image](屏幕快照 2015-11-30 19.59.51.png)

UITabbarController的代理
@protocol UITabBarControllerDelegate <NSObject>
@optional
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0);
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController;

- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers NS_AVAILABLE_IOS(3_0);
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed NS_AVAILABLE_IOS(3_0);
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray<__kindof UIViewController *> *)viewControllers changed:(BOOL)changed;

- (UIInterfaceOrientationMask)tabBarControllerSupportedInterfaceOrientations:(UITabBarController *)tabBarController NS_AVAILABLE_IOS(7_0);
- (UIInterfaceOrientation)tabBarControllerPreferredInterfaceOrientationForPresentation:(UITabBarController *)tabBarController NS_AVAILABLE_IOS(7_0);

- (nullable id <UIViewControllerInteractiveTransitioning>)tabBarController:(UITabBarController *)tabBarController
                      interactionControllerForAnimationController: (id <UIViewControllerAnimatedTransitioning>)animationController NS_AVAILABLE_IOS(7_0);

- (nullable id <UIViewControllerAnimatedTransitioning>)tabBarController:(UITabBarController *)tabBarController
            animationControllerForTransitionFromViewController:(UIViewController *)fromVC
                                              toViewController:(UIViewController *)toVC  NS_AVAILABLE_IOS(7_0);

@end

  • UITabBarControllerDelegate 自己设置为application
/** 记录上一次选中的子控制器的索引 */
@property (nonatomic, assign) NSUInteger lastSelectedIndex;


//@implementation AppDelegate
#pragma mark - <UITabBarControllerDelegate>
进入程序,默认选中tabBarController的第一个自控制器,但不会来这个方法,要点击之后才会来..
所以记录上一次选中的子控制器的索引,默认初始化记录为0,就刚好对应默认选中0,但不来这个方法
所以不记录上一次选中的子控制器而是记录上一次选中的子控制器的索引

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
    if (tabBarController.selectedIndex == self.lastSelectedIndex) { // 重复点击了同一个TabBar按钮
        // 发出通知
        [[NSNotificationCenter defaultCenter] postNotificationName:XMGTabBarButtonDidRepeatClickNotification object:nil];
    }
    
    // 记录目前选中的索引
    self.lastSelectedIndex = tabBarController.selectedIndex;
}

tabbarVc切换两个子控制器,两个子控制器的View的生命周期

![image](images/屏幕快照 2015-12-01 16.46.16.png)

![image](images/屏幕快照 2015-12-01 16.46.24.png)

  • 下面输出1,3A控 ,,2,4B控,,A切B

![image](images/屏幕快照 2015-12-01 16.46.08.png)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • 使用步骤 要想显示一个UIPopoverController,需要经过下列步骤 设置内容控制器 由于UIPopov...
    JonesCxy阅读 1,189评论 0 2
  • UIWindow 初始化: self.window= [[UIWindowalloc]initWithFrame:...
    Sunny_Fight阅读 1,033评论 0 1
  • 《伦敦间谍》这部腐国的间谍剧,没有碟中谍炫酷的打戏,没有007耍帅的道具,甚至连间谍都只是个喜欢数字的文职人员(出...
    阿雅喵阅读 369评论 0 0
  • 【美兮修能】20171103学习力践行记录D174 古诗韵文:出去散步看到柳树就唱了《咏柳》,又唱了《元日》《暮江...
    黄侠_美兮妈阅读 176评论 0 0
  • 文章中所使用软件和代码资源 示例apk示例代码binary view二进制文件查看工具:android 6.0系统...
    第八区阅读 3,440评论 0 3