你可能需要注意的細(xì)節(jié)(一) —— 關(guān)于UITabBarController的子控制器生命周期的問(wèn)題

版本記錄

版本號(hào) 時(shí)間
V1.0 2017.10.21

前言

目前市面上的APP架構(gòu)基本都是一樣的橄抹,都是UITabBarController作為根控制器,然后添加UINavigationController作為子控制器美尸,然后再添加幾個(gè)主頁(yè)控制器鞠柄,作為導(dǎo)航的根控制器。這里有一個(gè)問(wèn)題就是子控制器的生命周期問(wèn)題械馆。

問(wèn)題引出

關(guān)于注意UITabBarController子控制器生命周期的問(wèn)題胖眷,還是在iOS11以后,在iOS11正式版出來(lái)以后霹崎,我就發(fā)現(xiàn)一個(gè)問(wèn)題珊搀,凡是從幾個(gè)主頁(yè)面到二級(jí)頁(yè)面的控制器,UITabBar都會(huì)先顯示然后隱藏尾菇,做大約0.5s的一個(gè)動(dòng)畫(huà)境析,于是囚枪,我就要修改,想到第一個(gè)方案就是生命周期方法中強(qiáng)制隱藏和顯示UITarBar簿晓。

這里我就在項(xiàng)目中- (void)viewWillAppear:(BOOL)animated中強(qiáng)制顯示和在- (void)viewWillDisappear:(BOOL)animated中進(jìn)行強(qiáng)制隱藏眶拉,但是發(fā)現(xiàn)還是不多,通過(guò)打斷點(diǎn)憔儿,我發(fā)現(xiàn)原來(lái)是生命周期的問(wèn)題忆植。


素材準(zhǔn)備

下面我們就看一下準(zhǔn)備的實(shí)現(xiàn)素材。下面直接看代碼谒臼。

1. AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    JJTabBarVC *tabBarVC = [[JJTabBarVC alloc] init];
    self.window.rootViewController = tabBarVC;
    [self.window makeKeyAndVisible];
    return YES;
}
2. JJTabBarVC.m
#import "JJTabBarVC.h"
#import "ZBLivelistController.h"
#import "ZBVideoAlbumVC.h"
#import "ZBShortVideoVC.h"

@interface JJTabBarVC ()

@end

@implementation JJTabBarVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self addChildViewController];
}

#pragma mark - Object Private Function

- (void) addChildViewController
{
    [self addChirdViewControllerWithClass:[[ZBLivelistController alloc] init] andTitle:@"直播" andImage:[UIImage imageNamed:@"TabBar_LiveTab_normal"] selectImage:[UIImage imageNamed:@"TabBar_LiveTab_normal"]];
    [self addChirdViewControllerWithClass:[[ZBVideoAlbumVC alloc] init] andTitle:@"首頁(yè)" andImage:[UIImage imageNamed:@"TabBar_HomeTab_normal"] selectImage:[UIImage imageNamed:@"TabBar_HomeTab_normal"]];
    [self addChirdViewControllerWithClass:[[ZBShortVideoVC alloc] init] andTitle:@"短視頻" andImage:[UIImage imageNamed:@"TabBar_shortVideoTab_normal"] selectImage:[UIImage imageNamed:@"TabBar_shortVideoTab_normal"]];
}

- (void) addChirdViewControllerWithClass:(UIViewController *)vc andTitle:(NSString *)title andImage:(UIImage *)image selectImage:(UIImage *)selectImage
{
    vc.title = title;
    vc.tabBarItem.image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    vc.tabBarItem.selectedImage = [selectImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
    
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:vc];
    [self addChildViewController:nav];
}

@end
3. ZBLivelistController.m
#import "ZBLivelistController.h"

@interface ZBLivelistController ()

@end

@implementation ZBLivelistController

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    self.tabBarController.tabBar.hidden = NO;
    
    NSLog(@"ZBLivelistController --- viewWillAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    self.tabBarController.tabBar.hidden = YES;
    
    NSLog(@"ZBLivelistController --- viewWillDisappear");
}

@end
4. ZBVideoAlbumVC.m
#import "ZBVideoAlbumVC.h"

@interface ZBVideoAlbumVC ()

@end

@implementation ZBVideoAlbumVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    self.tabBarController.tabBar.hidden = NO;
    
    NSLog(@"ZBVideoAlbumVC --- viewWillAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    self.tabBarController.tabBar.hidden = YES;
    
    NSLog(@"ZBVideoAlbumVC --- viewWillDisappear");
}

@end
5. ZBShortVideoVC.m
#import "ZBShortVideoVC.h"

@interface ZBShortVideoVC ()

@end

@implementation ZBShortVideoVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    self.tabBarController.tabBar.hidden = NO;
    
    NSLog(@"ZBShortVideoVC --- viewWillAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    
    self.tabBarController.tabBar.hidden = YES;
    
    NSLog(@"ZBShortVideoVC --- viewWillDisappear");
}

@end

運(yùn)行起來(lái)如下圖所示朝刊。

但是測(cè)試一下,我們就會(huì)發(fā)現(xiàn)蜈缤,當(dāng)點(diǎn)擊短視頻拾氓,再點(diǎn)擊直播頁(yè)面的時(shí)候,tabBar沒(méi)有了底哥,所以我們看打印輸出咙鞍。

2017-10-22 00:22:26.648393+0800 testDemo[6569:592943] ZBLivelistController --- viewWillAppear
2017-10-22 00:22:28.486030+0800 testDemo[6569:592943] ZBLivelistController --- viewWillDisappear
2017-10-22 00:22:28.504998+0800 testDemo[6569:592943] ZBShortVideoVC --- viewWillAppear
2017-10-22 00:22:30.118026+0800 testDemo[6569:592943] ZBLivelistController --- viewWillAppear
2017-10-22 00:22:30.119026+0800 testDemo[6569:592943] ZBShortVideoVC --- viewWillDisappear

這里就會(huì)發(fā)現(xiàn),當(dāng)我們點(diǎn)擊短視頻趾徽,在點(diǎn)擊直播续滋,就會(huì)發(fā)現(xiàn),程序會(huì)先調(diào)用直播頁(yè)面ZBLivelistController --- viewWillAppear孵奶,而后調(diào)用短視頻頁(yè)面的ZBShortVideoVC --- viewWillDisappear疲酌,這就導(dǎo)致了UITabBar被隱藏掉了,為什么會(huì)這樣呢了袁,和我們平時(shí)看到的控制器是不一樣的朗恳,我們平時(shí)看到的都是先調(diào)用要消失控制器的willDisappear,后調(diào)用要出現(xiàn)的控制器視圖的willAppear方法载绿。在這里就是完全反的粥诫。這里我們?cè)趺唇鉀Q這個(gè)問(wèn)題呢?


問(wèn)題解決

有了上面的問(wèn)題崭庸,我們就要解決臀脏,最簡(jiǎn)單直接的方法就是在三個(gè)子控制器中多加一個(gè)方法,如下所示冀自。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    
    self.tabBarController.tabBar.hidden = NO;
}

這樣就解決了生命周期的問(wèn)題,解決隱藏時(shí)出現(xiàn)的錯(cuò)誤秒啦。這樣就可以在視圖出現(xiàn)的時(shí)候就不要隱藏UITabBar熬粗,解決了這個(gè)問(wèn)題。

后記

未完余境,待續(xù)~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末驻呐,一起剝皮案震驚了整個(gè)濱河市灌诅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌含末,老刑警劉巖猜拾,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異佣盒,居然都是意外死亡挎袜,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)肥惭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)盯仪,“玉大人,你說(shuō)我怎么就攤上這事蜜葱∪埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵牵囤,是天一觀(guān)的道長(zhǎng)爸黄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)揭鳞,這世上最難降的妖魔是什么炕贵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮汹桦,結(jié)果婚禮上鲁驶,老公的妹妹穿的比我還像新娘。我一直安慰自己舞骆,他們只是感情好钥弯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著督禽,像睡著了一般脆霎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狈惫,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天睛蛛,我揣著相機(jī)與錄音,去河邊找鬼胧谈。 笑死忆肾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的菱肖。 我是一名探鬼主播客冈,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稳强!你這毒婦竟也來(lái)了场仲?” 一聲冷哼從身側(cè)響起和悦,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渠缕,沒(méi)想到半個(gè)月后鸽素,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡亦鳞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年馍忽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚜迅。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡舵匾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谁不,到底是詐尸還是另有隱情坐梯,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布刹帕,位于F島的核電站吵血,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏偷溺。R本人自食惡果不足惜蹋辅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挫掏。 院中可真熱鬧侦另,春花似錦、人聲如沸尉共。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)袄友。三九已至殿托,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間剧蚣,已是汗流浹背支竹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鸠按,地道東北人礼搁。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像目尖,于是被迫代替她去往敵國(guó)和親叹坦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容