iOS基础界面UIViewController和导航介绍

首先区分content controller和container controller的区别。
co
【菜科解读】
iOS基础界面就是通过UIViewController展示的。
首先区分content controller和container controller的区别。
content controlller就是展示我们当前页面的controller,而container controller就是一个管理content controller的容器,基本就是UINavigationController和UITabbarController,本身它也是继承UIViewController,一个UIViewController压栈就是把它加入到container controller的view上。
下面说一下UIViewController的生命周期:
1. -(void)loadView; 这里用来加载controller的view,一般我们都必须调用[super loadView]来完成对view的加载,当然如果不需要用self.view也可以。
然后再对我们需要的子view进行生成和布局。
2.- (void)viewDidLoad; 这里代表view已经加载完成,一般用来处理数据model之类的。
3.- (void)viewWillAppear:(BOOL)animated; Controller将要被加入到当前window的回调,每次push或pop到当前controller就会回调这个函数,代表界面将要展示出来。
4.-(void)viewDidAppear:(BOOL)animated; Controller已经被加入到当前window,也就是push、present或pop的动画已经完成。
{可能被大多数人忽略的是,在每次调用viewWillAppear或viewDidAppear,系统都会调用一下两个函数:
(1)(void)viewWillLayoutSubviews 这个可能很多人忽略了,是5.0才增加的函数,界面将要对子view进行布局。
当通话或录音状态中,状态栏下移,也会回调这个函数。
(2)-(void)viewDidLayoutSubviews 这个跟4对应,也是5.0增加的函数,对子view布局完成。
}
一般在上面4个函数,我们已经可以完成界面的展示。
记得它们的先后顺序是必须的。
至于收到内存警告,在6.0等不同版本controller的不同回调我之前已经介绍过了,就不再介绍了。
关于Container Controller:
这里就只说介绍UINavigationController,本身它就是继承UIViewController,所以它具有上面所说的生命周期。
至于什么东西应该放在viewController,什么应该放在navgationController呢,这里说说我的理解。
因为navgationController就是管理controller的容器,所以它处理的应该就是controller的关系。
并且在某种意义上,它里面的controller就相当于它的一个子view,所以在navgationController的操作就能控制它里面的每个controller。
下面以现在比较流行的手势导航为例:(也就是在二级页面向右滑动就能返回)
@interface TestNavigationController()
{
UIPanGestureRecognizer*_panGesture; //手势导航的recognizer
CGPoint_panStartPoint; //记录开始滑动的point,只有滑动到一定宽度才开启导航
}
@property(nonatomic,retain)UIPanGestureRecognizer*panGesture;
@end
@implementationTestNavigationController
@synthesizepanGesture =_panGesture;
- (void)viewDidLoad
{
[superviewDidLoad];
//在navgationController的view添加手势,也就是为每个当前的controller添加了手势
[self.view removeGestureRecognizer:self.panGesture];
UIPanGestureRecognizer*panGesture = [[UIPanGestureRecognizeralloc]initWithTarget:self
action:@selector(handlePanGesture:)];
panGesture.minimumNumberOfTouches=1;
panGesture.maximumNumberOfTouches=1;
panGesture.delegate=self;
self.panGesture= panGesture;
[panGesturerelease];
[self.view addGestureRecognizer:self.panGesture];
}
-(void)handlePanGesture:(UIPanGestureRecognizer*)pan
{
//记录开始滑动的point
if(pan.state==UIGestureRecognizerStateBegan){
_panStartPoint= [panlocationInView:self.view];
}
//在滑动结束,判断滑动的距离是不是适合宽度,处理是否返回上级页面
if(pan.state==UIGestureRecognizerStateEnded) {
CGPoint_endPoint = [panlocationInView:self.view];
if(_endPoint.x-_panStartPoint.x>70.0f){
//二级页面就能滑动返回
if([self.viewControllerscount] >1){
[selfpopViewControllerAnimated:YES];
}
}
}
}
#pragma mark UIGestureRecognizerDelegate method //手势的delegate,处理一些同时进行的手势操作
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer*)gestureRecognizer
{
//一般情况下,如果上下滑动幅度太大,应该就是在滑动controller的tableview之类的,就不开启滑动导航
if(gestureRecognizer ==self.panGesture) {
CGPointtranslation = [(UIPanGestureRecognizer*)gestureRecognizertranslationInView:self.view];
return((fabs(translation.x) /fabs(translation.y) >5.0f) ?YES:NO);
}
return YES;
}
当我们把appDelegate的window.rootViewController设为TestNavigationController,就可以很方便快捷地实现滑动手势导航功能。
下面说一下静态视图modelViewController,通常我们就是用
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void(^)(void))completion压入一个模态视图。
其实静态的概念就是它入栈的方式和动画不同而已。
需要注意的是,一个navgationController不可以push一个navgationController,但是可以present一个navgationController。
另外,无论是一个viewController,还是navgationController,都可以present一个modelViewController,并且modelViewController并不加入到navgationController的导航栈中。
所以navgationController的topViewController和visibleViewController是不同概念的。
topViewController就是导航栈stack的栈顶,也就是不包括modelViewController,而visibleViewController是当前展示的viewController,如果有模态视图就是模态视图,否则就是topViewController。
最后用一句话总结, A viewController is a set of views, A navgationcontroller is a set ofviewControllers.
iOS,基础,界面,UIViewController,和,导ios8系统使用技巧?iOS8.2b2插件版本不支持
更多问题请关注我们的微信进行解决 果粉助手 微信号:chaxunzs 本微信具备功能:苹果序列号保修查询,菜叶说说,苹果最新报价,共存及越狱版微信、QQ、360、快播等的在线安装,越狱及美化教程,iphone技巧
苹果ios系统降级通道?苹果迷惑操作取消降噪功能
iOS 14.1于10月20日正式发布,按理说不该再次上线更新通道,这个情况不知道是不是系统BUG所致。
之前的文章中,数码盖饭已经详细说了iPhone(包括iPhone13系列)手机取消了通话降噪功能,苹果仍未修复!iPhone 13系列缺乏电话降噪功能,逼用户买降噪耳机?开启“电话降噪”后能有效降低周围环境噪音,提高通话清晰度,可惜苹果已经确认,iPhone13系列“通话降噪”不是Bug,而是苹果自己移除的。
以上苹果的行为引起了巨大的争议,一种是iPhone13系列默认开启降噪的功能,让用户不用去自行选择;另外一种是苹果手机就是为了卖耳机才采用的如此策略,认为苹果手机的策略就是强制让用户去购买耳机。
如果是第二种可能性,那么苹果手机官方还是欠大家一个解释。
1月17日消息,今日iPhone Xs Max国行版竟然开放了iOS 14.1(18A8395)版本签名,用户可以降级系统了。
难道这就是苹果手机给用户的后悔药? 据悉,iPhone Xs Max国行版竟然开放了iOS 14.1(18A8395)版本签名,用户可以降级系统了,在此之前,苹果每次在推送新版iOS之后,都会关闭上一个正式版系统的验证通道,升级过的系统基本不可能降级。
昨晚就有不少的iPhone Xs Max机友在群里讨论刷机的事情,有用户表示:国航亲测,降不了,爱思请求SHSH失败,iTunes报错3194,这个的解决办法是:这个升级后你需要多刷几次,当年数码盖饭的iPhone4也是显示刷不了,一直刷一直刷,后面给我刷回ios6了。
其中还有用户表示,刷机一台绑有ID的机器,菜叶说说,刷完开机激活居然没弹出ID激活,直接激活了。
其实也不是说利用这个漏洞可以刷ID,大家要知道,有登陆 ID 和有没有打开“查找我的iPhone”又是另外一回事了,大家不要传谣。