開發(fā)中最常見的界面設(shè)計(jì)就是:一個(gè)tabbarController,管理幾個(gè)navigationController或舞,各個(gè)navigationController管理下,又有很多的viewController。我們可能會(huì)遇到這樣的需求:在一個(gè)navigationController的第二層械哟、第三次...控制器下,在執(zhí)行某個(gè)操作時(shí)殿雪,需要將視圖推到navigationController的第一層暇咆,并控制tabbarController切換,顯示其他的子控制器(navigationController)丙曙;
首先我們知道:
1爸业、使用navigationController回到第一層的方法:
[self.navigationController popToRootViewControllerAnimated:YES];
2、使用tabbarController切換子控制器的方法:
self.navigationController.tabBarController.selectedIndex = 0;
問(wèn)題在于:我如何在pop到導(dǎo)航控制器的第一層后亏镰,讓tabbarController切換需要顯示的子控制器呢扯旷?
我的做法是:使用block回調(diào)
在講述我的做法之前,先介紹兩個(gè)類:MineViewController(我的類)與MineMessagesViewController(消息類)
1拆挥、他們同屬一個(gè)navigationController的控制下薄霜;
2、MineViewController(我的類)是第一層纸兔;
3惰瓜、MineMessagesViewController(消息類)是里面的某一層(第二層);
我需要在MineMessagesViewController(消息類)的點(diǎn)擊事件中汉矿,讓navigationController回到第一層崎坊,tabbarController展示其他navigationController
做法:
在MineMessagesViewController(消息類)中聲明一個(gè)block;
#import "BaseViewController.h"
typedef void(^MineMessageBlock)();
@interface MineMessagesViewController : BaseViewController
@property (nonatomic,copy)MineMessageBlock gotoSeeBlock;
@end
在MineMessagesViewController(消息類)的點(diǎn)擊事件中調(diào)用這個(gè)block:
self.gotoSeeBlock();
[self.navigationController popViewControllerAnimated:YES];
在MineViewController(我的類)中洲拇,我們收到了回調(diào)奈揍,然后控制tabbarController切換子視圖控制器
MineMessagesViewController *vc = [[MineMessagesViewController alloc]init];
//此處為重點(diǎn)
vc.gotoSeeBlock = ^{
self.navigationController.tabBarController.selectedIndex = 0;
};
[self.navigationController pushViewController:vc animated:YES];
網(wǎng)上有個(gè)更簡(jiǎn)單的方法:
__weak typeof (self)weakSelf = self;
weakSelf.navigationController.tabBarController.selectedIndex = 0;
[weakSelf.navigationController popViewControllerAnimated:NO];
親測(cè)有效。
結(jié)合兩種方法來(lái)看赋续,貌似我的做法有些多余男翰,畢竟無(wú)論是navigationController的哪個(gè)子控制,都能通過(guò)“點(diǎn)語(yǔ)法”找到其本身纽乱,然后再通過(guò)“點(diǎn)語(yǔ)法”找到其tabbarController蛾绎;唯一需要注意的就是循環(huán)應(yīng)用的問(wèn)題,一個(gè)弱引用就解決了。所以我的做法有些“蛇足”租冠。
測(cè)試效果:兩者沒(méi)有明顯區(qū)別鹏倘,且都存在一個(gè)問(wèn)題:沒(méi)有了popViewController的動(dòng)畫;
那么如何進(jìn)一步優(yōu)化呢顽爹?
我有個(gè)想法:使用協(xié)議纤泵,讓MineMessagesViewController修改MineViewController的一個(gè)屬性的值,在MineViewController 的viewDidAppear方法中根據(jù)這個(gè)屬性值镜粤,決定是否控制tabbarController切換子視圖捏题,在MineViewController的viewWillDisappear方法中重置這個(gè)屬性的值。