在tabBarController模式下怎么对uiviewcontroller透明刷新

特酷吧[]采用&署名-非商业用途-保持一致&的创作共用协议,使用本文内容请遵循该协议 最近特酷吧所在的项目组对项目进行了一些基础组件的优化,其中有关于UITabBarController隐藏tabBar的问题感觉有必要总结下。一,需求分析先来说说项目基本需求:整个项目由左侧栏和主视图组成,主视图主体是一个UITabBarController,下属几个嵌套了UINavigationController的UIViewController。要求:当在页面上下滑动的时候,根据用户手势需要隐藏显示底部栏,也就是默认的UITabBarController的tabBar。特酷吧在设计的时候是将左侧栏和主视图通过addChildViewController的方式添加到一个容器UIViewController中,并使用了UITabBarController自带的tabBar。隐藏显示tabBar是通过修改tabBar的frame来实现的。界面布局演示代码如下:
self.window&=&[[[UIWindow&alloc]&initWithFrame:[[UIScreen&mainScreen]&applicationFrame]]&autorelease];&&
UIViewController&*parentController&=&[[UIViewController&alloc]&init];&&
SideBarViewController&&*sideBarViewController&=&[[SideBarViewController&alloc]&init];&&
UINavigationController&*sideBarNavController&=&[[UINavigationController&alloc]&initWithRootViewController:&sideBarViewController];&&
sideBarNavController.navigationBarHidden&=&YES;&&
[parentController&addChildViewController:sideBarNavController];&&
[parentController.view&addSubview:sideBarNavController.view];&&
MyUITabBarController&*tabBarController&=&[[MyUITabBarController&alloc]&init];&&
[parentController.view&addSubview:&tabBarController.view];&&
self.window.rootViewController&=&parentC&&其中MyUITabBarController中的演示代码如下:
UIViewController&*controller1&=&[[UIViewController&alloc]&init];&&
&&UINavigationController&*navigationController1&=&[[UINavigationController&alloc]initWithRootViewController:&controller1];&&
&&UIViewController&*controller2&=&[[UIViewController&alloc]&init];&&
&&UINavigationController&*navigationController2&=&[[UINavigationController&alloc]initWithRootViewController:&controller2];&&
&&navigationController1.navigationBarHidden&=&YES;&&
&&navigationController2.navigationBarHidden&=&YES;&&
&&NSArray&*controllers&=&[NSArray&arrayWithObjects:&navigationController1,&navigationController2,nil];&&
&&self.viewControllers&=&&&
&&self.selectedIndex&=&0;&&在测试中发现:在iOS SDK6的环境下移动tabBar后,界面会留出空白,也就是说UITabBarController的tabBar的部分实际上是独占了该区域,即使强制将tabBar通过设置frame将tabBar移开,在该区域也不会显示其他内容。关于这个问题,github上有一个解决方案:该方案代码很简洁:就是在移动tabBar之后,修改视图的frame大小,问题看似解决了。二,我为什么没有使用UITabBarController_setHidden似乎UITabBarController_setHidden能够解决问题,但在实际使用的时候发现一个问题,当使用pushViewController弹出一个UIViewController【配置hidesBottomBarWhenPushed=YES,页面弹出时tabBar隐藏】,接着popViewControllerAnimated弹回时,tabBar会自动显示并将所属页面的frame重新设置了。这样,设置页面frame的时机不好控制,另外这种方式在页面切换的时候也会有些不太美观的效果。使用系统自带的tabBar或者navigationBar的好处是显而易见的,不过在本例中的情形(需要手势去隐藏显示底部栏),使用自定的tabBar反而不好处理。尝试失败之后,我决定使用自定义的tabBar,想要自定义tabBar,一个问题就是怎么隐藏自带的tabBar。三,如何隐藏UITabBarController自带的tabBar网络上有方法:self.tabBar.hidden = YES;甚至是[self.tabBar removeFromSuperview];这些确实能实现隐藏tabBar的功能,但是隐藏了之后在tabBar原有的位置没有填充上内容。正确的做法是:将UITabBarController中的各个RootViewController进行如下设置:self.homeViewController.hidesBottomBarWhenPushed = YES;在特酷吧的工程中,还遇到了一个问题:即使设置了hidesBottomBarWhenPushed,在界面的底部还是留有一块没有内容的区域(正好是tabBar的区域)。经过查询,发现原因是在添加主体UITabBarController到容器UIViewController的时候,使用了addChildViewController的方式,将addChildViewController去掉,只保留addSubview的方式,一切运行正常。四,addChildViewController怎么能影响到UITabBarController的tabBar这个问题我暂时不清楚是由什么造成的。但说到这里了就谈谈特酷吧对这种方式的看法:使用addChildViewController的方式来处理本文描述的场景并没有什么好处。addChildViewController这种方式我感觉主要是为了能方便页面切换(使用transitionFromViewController方法),而本场景中,并不是&两个页面切换&,而是左侧栏和主体视图一直都存在,只是通过手势移开或者显示各自的view而已。之前我都是只使用addSubview将左侧栏的view和主体view(都是UIController的view)依次添加到一个容器上,网络上有人说&[viewController.view addSubview:someOtherViewController.view];&这种方式其实对是UIViewController的误用,因为这么做&将不会触发被加入view hierarchy的view的controller的viewWillAppear:方法&。。 转载请注明来自,本文地址:推荐阅读:
博主推荐文章在tabBarController模式下怎么对UIViewController刷新_百度知道
在tabBarController模式下怎么对UIViewController刷新
提问者采纳
在该控制类里面写一个方法:- (void)setDataSource{
tabview.dataSource =
tabview.dataSource =}在AppDelegate.m中调用:- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
if(viewController.tabBarItem.tag == 3){
UINavigationController *navigationctr = (UINavigationController *)viewC
SecondViewController *secvc = (SecondViewController *)navigationctr.topViewC
[secvc setDataSource];
电子产品技术支持
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁收藏,2.5k 浏览
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我期中有一个HomeViewController 是UIViewController 是点击第一个UITabBarItem触发的页面 然后我想在这个页面中写代理UITabBarDelegate 也就是我想用-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)Item 这个方法 但是一旦写了这一句
self.tabBarController.tabBar.delegate =就报错 难道不是这样获取代理吗
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
你的HomeViewController是继承自UITabBarController吗?
如果是的话不需要再手动设置self为代理,同理UITableViewController
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
self.tabBarController.tabBar.delegate = self
-(void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)Item
以上应该写在UITabBarController中,而不是写在UIViewController中。
同步到新浪微博
分享到微博?
与我们一起探索更多的未知
专业的开发者技术社区,为用户提供多样化的线上知识交流,丰富的线下活动及给力的工作机会
加入只需一步
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要举报该,理由是:
扫扫下载 App
SegmentFault
一起探索更多未知UITabBarController详解
Carl_huang| 11:26|次浏览|
当我们想要做一个界面类似 联系人 那样的程序时,就一定会用到 UITabBar,它可以帮我们添加、管理许多的Tab项, 使我们的程序包含不同的操作模式,由于管理UITabBar可能会有些麻烦,所以apple也帮我们对其进行了封装,产生了简单好用的UITabBarController,就像UITableViewController对UITableView的封装,只不过在用到UITabBarController时,我们不用像使用UITableViewController那样去继承它。
一、UITabBarController主要用来管理你提供的content view controllers,而每一个 content view controller则负责管理自己的view层级关系,通常,当你的程序想要提供一些平行(同一个等级的)的不同界面,而恰好这些界面使用到的数据是一类的,或者功能是一个系列的,那 tab bar interface 是非常有用的.
在这样的 tab bar interface界面中,你可以设置许多的 tab ,每一个 tab则一定要指定一个content view controller,当某个tab被点击时,UITabBarController就会选中该tab并且显示该viewController所持有的content view.在apple官网上有一张关于UITabBarController的图片,如下:
观察上图,最下面的那个Tab bar,这是由UITabBarController自己负责维护的,就像UINavigation Bar是由UINavigationController负责维护一样,不建议被修改,但如果实在需要改变的话,只能通过UITabBarController提供的方法去修改。
你有没有发现,绝大多数的iOS程序,如果他用到了UITabBarController,那么他的外观就像上图,Tab bar默认在下面,但有时我们又希望将他显示到最上面去,就像android的联系人程序一样,其实只要几句代码就行了:
CGRect frame = CGRectMake(0, 20, 320, 44)
tabBarController.tabBar.frame =
呵呵,这样不就可以了,你想放哪放哪,不过可别太难看了。
二、一个标准的 tab bar interface 通常由下列对象组成:
1.一个 UITabBarController 对象
2.每一个tab 都必须有一个content view controller(所以UITabBarController有一个属性是viewControllers)
3.一个可选的delegate对象
注意了:通常而言,UITabBarController一般作为应用程序的rootViewController,而且它不能作为UINavigationController的rootViewController.
所以初始化的代码一般这样写:
self.viewController&=&[[ViewController&alloc]&initWithNibName:@&ViewController&&bundle:nil];&&&&&ViewControllerA&*A&&=&[[ViewControllerA&alloc]initWithNibName:@&ViewControllerA&&bundle:nil];&&&&&ViewControllerB&*B&&=&[[ViewControllerB&alloc]initWithNibName:@&ViewControllerB&&bundle:nil];&&&&&ViewControllerC&*C&&=&[[ViewControllerC&alloc]initWithNibName:@&ViewControllerC&&bundle:nil];&&&&&ViewControllerD&*D&&=&[[ViewControllerD&alloc]initWithNibName:@&ViewControllerD&&bundle:nil];&&&&&ViewControllerE&*E&&=&[[ViewControllerE&alloc]initWithNibName:@&ViewControllerE&&bundle:nil];&&&&&&&&&&UITabBarController&*tabBarController&=&[[UITabBarController&alloc]init];&&&&&&&&&&A.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemBookmarks&tag:0];&&&&&self.viewController.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemContacts&tag:1];&&&&&B.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemDownloads&tag:2];&&&&&C.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemHistory&tag:3];&&&&&D.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch&tag:4];&&&&&E.tabBarItem&=&[[UITabBarItem&alloc]initWithTabBarSystemItem:UITabBarSystemItemTopRated&tag:5];&&&&&&&&tabBarController.viewControllers&=&@[self.viewController,A,B,C,D,E];&&&&&tabBarController.customizableViewControllers&=&@[B,C,D,E];&&&&&[tabBarController&setSelectedIndex:2];&&&&&tabBarController.delegate&=&self;&//&CGRect&frame&=&CGRectMake(0,&20,&320,&44);&//&tabBarController.tabBar.frame&=&&&self.window.rootViewController&=&tabBarController;&
你应该像上面那样,为每一个viewController指定一个tabBarItem,当然你也可以这样初始化
A.tabBarItem = [[UITabBarItem alloc]initWithTitle:&#(NSString *)#& image:&#(UIImage *)#& tag:&#(NSInteger)#&];
从而达到自定义tab bar item外观的目的,而不必使用系统提供好的,但此时你使用的图片大小要有规定了,一般ipad在60*60,iPhone在30*30左右,
可以参考链接;
再来看下面这张图,它描绘了UITabBarController和它的属性viewControllers、customizableViewControllers和selectedViewController等的关系
如果你的viewControllers属性添加了多于五个的items,那tab bar controller将会自动插入一个特殊的view controller,称为 More view controller,该 controller 将会负责管理多于的items,这个More view controller提供一个自定义的界面,用table的方式呈现多余的view controller,并且view controller的数量是不限制的。对于这个more view& controller ,UITabBarController 通过一个属性----moreNavigationController持有它的引用,但看名字就知道他是一个UINavigationController对象,所有我们可以修改它的一些属性,如:
UINavigationController *nav = tabBarController.moreNavigationC
[nav setNavigationBarHidden:YES];
当然,如不是必须,最好不要修改它。
三、在创建一个tab bar interface之前,你应该考虑清楚程序是否真的需要使用该布局,而且应该在正确的地方使用它
通常通过下面这些方式使用:
1.作为window的root view controller
2.作为 split view interface(iPad专有界面,不知道的可以百度下)中的其中一个一个view controller
3.作为modal view使用
4.作为UIPopoverController(iPad专有)的content view
四、在tab bar interface创建好后,我们可以用代码动态的修改它
如:增加或删除tab项,对于这种操作,通常我们需要重新指派UITabBarController的viewConrollers属性来进行,有人可能要问了,为什么要重新指派,viewController不是一个数组吗,不能直接通过数组的remove方法直接删除吗,可别忘了,这个属性的类型是个NSArray,不能进行删除,添加的。我们知道,当tab bar interface界面显示后,我们只能在某一时刻操作一个界面,因此,修改viewControllers属性必须在某个content viewController中完成,我们可以通过UIViewController的属性 tabBarController来获得UITabBarController的引用,就像获得UINavigationController的引用一样,修改代码如下:
NSMutableArray*&newArray&=&[NSMutableArray&arrayWithArray:self.tabBarController.viewControllers];&&&&&&&[newArray&removeObject:self];&&&&&&&&&[self.tabBarController&setViewControllers:newArray&animated:YES];&
五、当你点击某个tab项时,它对应的content viewController会得到显示,
但有时也许我们就是不希望某个被你点击的view得到显示,如:某个viewController所需的数据还没有完成加载,或者必须等某个登陆界面 完成登陆后
才能激活其他viewController,此时你可以实现UITabBarControllerDelgate中的方法
- (BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController NS_AVAILABLE_IOS(3_0)
通过设置返回值来禁止某个viewController能否被选中,如下:
-&(BOOL)tabBarController:(UITabBarController&*)aTabBar&&&&&&&&&&shouldSelectViewController:(UIViewController&*)viewController&{&if&(![self&hasValidLogin]&&&&(viewController&!=&[aTabBar.viewControllers&objectAtIndex:0])&)&&&&{&//&Disable&all&but&the&first&tab.&return&NO;&&&&}&return&YES;&}&
当然你也可以通过代码手动去选择某个viewController,只要设置UITabBarController的属性selectedViewController 或者 selectedIndex(从0开始),但此时代理的方法是无效的,也就是说,如果你通过代码来选中某个viewController的话,则肯定是可以选中的。。。
六、其实UITabBarController还允许你对viewControllers进行排序,你可以使任意一个viewController出现在第一个tab项中,上面我们有提到moreNavigationController,当tabs超过5个时,也就是viewControllers的个数超过5个时,最后一个的tab item默认为more,然后那些没能显示在tab上的viewController便可通过moreNavigationController以列表的形势显示,那是不是那些没能在tab上显示的viewController就永远只能在moreNavigationController的列表中显示了??当然不是,当我么点击more
tab时会出现下面左图的界面,然后再点击navigationBar左边的编辑按钮时会出现下面的右图,此时你可以把这些显示的tab直接拉到下面的 tab bar中,从而达到自定义tab的功能
那如果我希望某个viewController一直在tab上显示,二不希望用户将其排列到more tab中去,那该怎么办呢。。。。UITabBarController有个属性customizableViewControllers
&由它来决定哪些viewController允许重排列。。不过这里要注意了,默认情况下customizableViewControllers 和&viewControllers属性包含的内容是一样的,你可以手动设置它为viewControllers的字集(只能是字集),但当你重新更新了viewControllers时,customizableViewControllers又会默认和viewControllers相等,希望表达清楚了。。。
看看上面的图,是不是和应用程序的badge很像,当某个tab有信息需要你处理时,显示这个能很好的引起用户的注意,而你只需这样做
if&(numberOfNewItems&==&0)&&&&self.tabBarItem.badgeValue&=&nil;&else&self.tabBarItem.badgeValue&=&[NSString&stringWithFormat:@&%d&,&numberOfNewItems];&
self 是 viewContrller ,不过要注意了,这里的badgeValue是个NSString类型的,不要和下面的弄混了
[UIApplication sharedApplication].applicationIconBadgeNumber = 2
通常情况下,当我们点击显示了badge的那个tab后,这个红色的提示就应该消失。呵呵,可别忘了,当你切换tab时,viewController的声明周期可是一样的,它会执行那些
viewDidAppear 、viewDidDisappear等方法,所以最好的办法就是在该viewContrller的
-(void)viewDidAppear:(BOOL)animated方法中,将其重置为空,
如:self.tabBarItem.badgeValue =
八、UITabBarController是否能旋转呢?那要看它的那些viewControllers了,如果在viewControllers中只要有一个viewController不支持某个方向的旋转,那UITabBarControlelr就也不能旋转到该方向。再来看看它的一些代理方法,我就简单描述下:
//当你选中某个tab 项时调用,我们可以在这里做一些操作,如隐藏状态栏,导航栏什么的。
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
//当点击more后出现moreNavigationController画面时,点击那个edit按钮时触发
- (void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers NS_AVAILABLE_IOS(3_0)
//下面两个方法在点击那个done按钮时触发
- (void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed NS_AVAILABLE_IOS(3_0)
- (void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray*)viewControllers changed:(BOOL)changed
来自:http://my.oschina.net

我要回帖

更多关于 uiviewcontroller切换 的文章

 

随机推荐