iOS文档补完计划–UIViewController
目录
-
UIViewController
-
职责
-
视图管理
-
处理与视图相关的通知
-
实现容器视图控制器
-
内存管理
-
生命周期
-
-
以代码的方式创建一个控制器
-
initWithNibName:bundle:
-
initWithCoder:
-
-
管理视图
-
view
-
viewLoaded
-
loadView
-
viewDidLoad
-
loadViewIfNeeded
-
viewIfLoaded
-
title
-
preferredContentSize
-
-
呈现视图控制器
-
modalPresentationStyle
-
modalTransitionStyle
-
showViewController:sender:
-
presentViewController:animated:completion:
-
dismissViewControllerAnimated:completion:
-
-
响应View事件
-
View XX Appear
-
beingDismissed && beingPresented
-
Moving XX ParentViewController
-
-
安全区域
-
additionalSafeAreaInsets
-
viewSafeAreaInsetsDidChange
-
-
布局视图
-
edgesForExtendedLayout
-
extendedLayoutIncludesOpaqueBars
-
updateViewConstraints
-
viewWill/DidLayoutSubviews
-
-
子视图控制器
-
childViewControllers
-
addChildViewController:
-
removeFromParentViewController
-
transitionFromViewController:toViewController:duration:options:animations:completion:
-
shouldAutomaticallyForwardAppearanceMethods
-
AppearanceTransition
-
-
响应容器事件
-
willMoveToParentViewController
-
didMoveToParentViewController
-
-
获取其他控制器
-
presentingViewController && presentedViewController
-
parentViewController
-
navigationController
-
splitViewController
-
tabBarController
-
-
处理内存警告
-
didReceiveMemoryWarning
-
-
协调系统手势
-
preferredScreenEdgesDeferringSystemGestures
-
childViewControllerForScreenEdgesDeferringSystemGestures
-
-
管理状态栏
-
childViewControllerForStatusBarStyle
-
childViewControllerForStatusBarHidden
-
preferredStatusBarStyle
-
prefersStatusBarHidden
-
modalPresentationCapturesStatusBarAppearance
-
preferredStatusBarUpdateAnimation
-
setNeedsStatusBarAppearanceUpdate
-
-
配置导航入口
-
navigationItem
-
hidesBottomBarWhenPushed
-
toolbarItems
-
tabBarItem
-
-
编辑行为
-
editing
-
setEditing:animated:
-
editButtonItem
-
UIViewController
-
职责
-
更新视图内容
-
响应交互
-
调整入口View布
-
与程序中其他对象(包括其他控制器)进行协调
UIViewController
作为 UIResponder
、被插入响应链之间。如果其持有的视图中没有一个可以处理某事件、控制器可以选择自行处理或者传递给父视图。
控制器很少单独被使用、我们通常使用多个控制器进行相互的跳转作业。
-
视图管理
根View主要充当视图层次结构的其余部分的容器。
根View的大小和位置由拥有它的对象决定,该对象要么是视图控制器,要么是应用程序的Window。
Window所拥有的视图控制器是应用程序的根View控制器,它的视图是用来填充Window的。
View属性是懒加载的、有几种方式可以指定ViewController的View:
-
Storyboard
可以指定视图及其与视图控制器的连接。
你也指定视图控制器之间的关系和segue。
-
Nib
使用Nib文件为视图控制器指定单个视图控制器的视图。
但不允许定义segue或视图控制器之间的关系。
-
loadView方法
以代码方式创建视图层次结构,并将该层次结构的根视图分配给视图控制器的
View属性
。
所有的方式都能导向相同的结果:创建VIew并且通过ViewController.view属性进行公开。
需要注意的是
多个Controller使用同一个 Storyboard
或者 Nib
作为View属性时、他们会持有单独的副本。
而代码方式、你必须确保View不会被多个VC持有。
-
处理与视图相关的通知
视图的可见性
当视图的可见性发生变化时,视图控制器会自动调用它自己的方法,以便子类可以对变化做出响应。比如 viewWillAppear
在展示之前进行设置、 viewWillDisappear:
在消失之前进行状态保存或更改。
-
实现容器视图控制器
我们的日常开发中常有这样一种需求,通过切换标签来切换不同的页面,如果在一个 controller 管理这些 view 的话,代码就显得耦合度过高,也与 Apple 的 MVC 模式不符合,Apple 推荐一个 controller 管理一个 view。这样做有三个好处:
1.无疑,对页面中的逻辑更加分明了。相应的View对应相应的ViewController。
2.当某个子View没有显示时,将不会被Load,减少了内存的使用。
3.当内存紧张时,没有Load的View将被首先释放,优化了程序的内存释放机制。
4.在子VC上调用 self.navigationController
可以传递给父VC。(UIPageController上特别好用)
像这样使用
//添加 [self addChildViewController:sfViewControllr]; [self.view addSubview:sfViewControllr.view]; sfViewControllr.view.frame = CGRectMake(0, 300, 1, 1); //移除 [sfViewControllr didMoveToParentViewController:self];
如果只是 [self.view addSubview:sfViewControllr.view];
的方式用另一个 controller 来控制,但是这样会产生一个新的问题:直接 add 进去的subView不在 viewController的 view hierarchy 内,事件不会正常传递,如:旋转、触摸等,属于危险操作违背CocoaTouch开发的设计MVC原则,viewController应该且只应该管理一个view hierarchy。
-
内存管理
内存是iOS中的关键资源,视图控制器提供了内置支持,在关键时刻减少内存占用。UIViewController类通过它的 didReceiveMemoryWarning
方法提供一些低内存条件的自动处理,这些方法释放不需要的内存。
-
生命周期
-
+[ViewController load]
-
+[ViewController initialize]
-
-[ViewController init]
-
-[ViewController loadView]
-
-[ViewController viewDidLoad]
-
-[ViewController viewWillAppear:]
-
-[ViewController updateViewConstraints]
-
-[ViewController viewWillLayoutSubviews]
-
-[ViewController viewDidLayoutSubviews]
-
-[ViewController viewDidAppear:]
-
-[ViewController dealloc]
其中1和2严格意义上来讲应该不算在内
以代码的方式创建一个控制器
-
– initWithNibName:bundle:
通过代码的方式实例化一个IB方式创建的控制器
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil; TestViewController *tvc = [[TestViewController alloc] initWithNibName:@"xx" bundle:nil]; // 注意xib名字不要后缀
需要指定xx.xib的file’s owner的Custom Class为TestViewController,并且把file’s owner的view指定为其中的一个view
-
– initWithCoder:
在IB中创建的类、但在xocde中被实例化时被调用
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
管理视图
-
view
容器视图
@property(nonatomic, strong) UIView *view;
-
这个属性是来加载的、当你访问时如果为nil、将调用
loadView
方法并返回view
。 -
每一个VC、都必须是该View的唯一一个持有者。(例外情况是通过
addChildViewController:
方法添加后、将vc.view add给另一个vc) -
你可以通过
isViewLoaded
方法来检测当前vc是否已经持有视图。(这样不会触发懒加载)。 -
VC有权在低内存情况下以及VC最终释放时、释放这个属性。
-
viewLoaded
self.view
是否有值
@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded;
这个属性的检测不会触发 view
属性的懒加载。
-
– loadView
创建容器视图
- (void)loadView;
当 view
属性被访问但本身没有值时触发、你可以在这里自定义 view
属性的视图。
-
永远不要直接调用这个方法。
-
如果使用
nib
、该方法从nib
中加载视图。如果不是、则直接创建一个UIView
。 -
如果使用IB来创建VC、不要覆盖这个方法。
-
如果自定义
view
。您创建的视图应该是唯一的实例,不应该与任何其他视图控制器对象共享。此方法的自定义实现不应调用super。 -
如果想对
view
进行其余的动作(添加subVIew等等)、请在
viewDidLoad`中执行。
通常用在进到vc就要切换view的时候使用、比如进来就是一张图片啊、webView啊之类。
-
– viewDidLoad
在 loadView
后执行。表示此时已经有view属性
- (void)viewDidLoad;
不管视图层次结构是从nib文件加载的还是在loadView方法中以编程方式创建的,都会调用此方法。
通常在这里对view进行进一步配置。
-
loadViewIfNeeded
主动尝试调用loadView
- (void)loadViewIfNeeded;
正常如果我们主动调用 [self loadView];
是不会触发 viewDidLoad
的、但这个方法可以。
不过似乎必须要 [self isViewLoaded] == NO
才行
-
viewIfLoaded
返回vc的view。并且不会触发懒加载
@property(nonatomic, readonly, strong) UIView *viewIfLoaded;
如果没有则返回nil
-
title
标题
@property(nonatomic, copy) NSString *title;
如果VC有一个有效的导航项或标签栏项,为该属性赋值将更新这些对象的标题文本。
相当于同时设置了 tabBarItem.title
和 navigationItem.title
。
-
preferredContentSize
我们可以使用preferredContentSize来设置我们期望的childViewController的界面的大小
@property(nonatomic) CGSize preferredContentSize;
没太理解怎么用、有明白的大佬举个例子?
呈现视图控制器
-
modalPresentationStyle
模态跳转的样式
@property(nonatomic, assign) UIModalPresentationStyle modalPresentationStyle;
UIModalPresentationStyle
为一个枚举类型
在iPhone和iPod touch上面系统始终已UIModalPresentationFullScreen模式显示presented VC。(哈哈哈。很气、我试了半天差了好多资料最后看到这句话)
typedefNS_ENUM(NSInteger, UIModalPresentationStyle) { UIModalPresentationFullScreen =0,//全屏覆盖 UIModalPresentationPageSheet,//弹出VC时,presented VC的高度和当前屏幕高度相同,宽度和竖屏模式下屏幕宽度相同,剩余未覆盖区域将会变暗并阻止用户点击,这种弹出模式下,竖屏时跟 UIModalPresentationFullScreen的效果一样,横屏时候两边则会留下变暗的区域。 UIModalPresentationFormSheet,// presented VC的高度和宽度均会小于屏幕尺寸,presented VC居中显示,四周留下变暗区域。 UIModalPresentationCurrentContext,//这种模式下,presented VC的弹出方式和presenting VC的父VC的方式相同。 UIModalPresentationCustom,//自定义视图展示风格,由一个自定义演示控制器和一个或多个自定义动画对象组成。符合UIViewControllerTransitioningDelegate协议。使用视图控制器的transitioningDelegate设定您的自定义转换。 UIModalPresentationOverFullScreen,//如果视图没有被填满,底层视图可以透过 UIModalPresentationOverCurrentContext,//视图全部被透过 UIModalPresentationPopover, UIModalPresentationNone , };
-
modalTransitionStyle
设置过渡动画样式
@property(nonatomic, assign) UIModalTransitionStyle modalTransitionStyle;
在通过 presentViewController:animated:completion:
进行模态跳转时的专场动画样式。默认 UIModalTransitionStyleCoverVertical
UIModalTransitionStyle
是一个枚举类型
typedef NS_ENUM(NSInteger, UIModalTransitionStyle) { UIModalTransitionStyleCoverVertical =0,//从底部滑入 UIModalTransitionStyleFlipHorizontal,//水平翻转 UIModalTransitionStyleCrossDissolve,//交叉溶解 UIModalTransitionStylePartialCurl NS_ENUM_AVAILABLE_IOS(3_2),//翻页效果 };
-
showViewController:sender:
大一统的跳转方法
- (void)showViewController:(UIViewController *)vc sender:(id)sender; - (void)showDetailViewController:(UIViewController *)vc sender:(id)sender;
全能型界面切换的方法,它能根据当前的试图控制器情况来决定是用navVC的push方法还是普通VC的Modal方式来切换界面。
-
当前界面是Nav的子VC时
它会用push方式切换。
-
当前界面为Modal的界面,
就会用modal方式切换。
但也有些缺陷、比如不能设置是否执行动画、获取不到完成的block。
一般情况下,horizontally compact(iphone) 环境下,意义不大(因为不太需要考虑 UISplitViewController
)。
-
– presentViewController:animated:completion:
以模态方式呈现一个VC
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated:(BOOL)flag completion:(void (^)(void))completion;
在水平规则环境中,视图控制器以 modalPresentationStyle
属性指定的样式表示。
任何情况下都可以通过 modalTransitionStyle
属性进行转场设置。
在 viewDidAppear
之后调用 completion
回调。
-
– dismissViewControllerAnimated:completion:
退出一个由模态方式展示的VC
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion;
在 viewDidDisappear
之后调用 completion
回调。
响应View事件
-
View XX Appear
视图的显示与隐藏
- (void)viewWillAppear:(BOOL)animated; // 视图即将显示时调用 - (void)viewDidAppear:(BOOL)animated; // 视图已经显示时调用 - (void)viewWillDisappear:(BOOL)animated; // 视图将要消失时调用 - (void)viewDidDisappear:(BOOL)animated; // 视图已经消失时调用
这张图应该很清楚了
.h文件里说 这四个方法默认什么都不做
、但是文档里说 务必调用super方法
。
-
beingDismissed && beingPresented
视图是否正在消失/显示
@property(nonatomic, readonly, getter=isBeingPresented) BOOL beingPresented NS_AVAILABLE_IOS(5_0); //正在显示 @property(nonatomic, readonly, getter=isBeingDismissed) BOOL beingDismissed NS_AVAILABLE_IOS(5_0);//正在消失
-
Moving XX ParentViewController
视图是否正在从父VC来/向父VC去
@property(nonatomic, readonly, getter=isMovingToParentViewController) BOOL movingToParentViewController NS_AVAILABLE_IOS(5_0); //向父VC去 @property(nonatomic, readonly, getter=isMovingFromParentViewController) BOOL movingFromParentViewController NS_AVAILABLE_IOS(5_0); //从父VC来
安全区域
-
additionalSafeAreaInsets
修改安全区域的内嵌程度
@property(nonatomic) UIEdgeInsets additionalSafeAreaInsets;
比如如果 SafeAreaInset
值为(20,0,0,0),那么页面上的TableVIew可能会下移20个单位。
此时设置additionalSafeAreaInsets属性值为(-20,0,0,0),则SafeAreaInsets不会对adjustedContentInset值产生影响。以便正常显示。
有兴趣可以看看 《iOS 11 安全区域适配总结》
-
– viewSafeAreaInsetsDidChange
当VC的 safeAreaInsets
发生改变是被调用
- (void)viewSafeAreaInsetsDidChange;
布局视图
-
edgesForExtendedLayout
指定view的边(上、下、左、右)延伸到整个屏幕
@property(nonatomic, assign) UIRectEdge edgesForExtendedLayout;
默认值是UIRectEdgeAll, 意味着view会被拓展到整个屏幕。
它只有当viewController被嵌到别的container view controller中时才会起作用
-
extendedLayoutIncludesOpaqueBars
如果status bar是不透明的,view不会被延伸到status bar,除非extendedLayoutIncludesOpaqueBars = YES;
@property(nonatomic, assign) BOOL extendedLayoutIncludesOpaqueBars;
默认为NO。在iOS 7.0中,bars默认是半透明的。
-
updateViewConstraints
当自身view属性的布局被修改时被自动调用
- (void)updateViewConstraints;
这个方法默认的实现是调用对应View的 -updateConstraints
调用[super updateViewConstraints]作为实现的最后一步。
-
viewWill/DidLayoutSubviews
重新布局子View前/后调用
- (void)viewWillLayoutSubviews NS_AVAILABLE_IOS(5_0); - (void)viewDidLayoutSubviews NS_AVAILABLE_IOS(5_0);
这两个方法的默认实现什么都不做
其中 viewDidLayoutSubviews
可以获取子控件正确的frame
子视图控制器
具体的作用可以回去看看《UIViewController》 >>>《实现容器视图控制器》部分的解释。
-
childViewControllers
存放子VC的数组
@property(nonatomic, readonly) NSArray*childViewControllers;
-
– addChildViewController:
添加子VC
- (void)addChildViewController:(UIViewController *)childController;
-
– removeFromParentViewController
从父VC上移除
- (void)removeFromParentViewController;
-
– transitionFromViewController:toViewController:duration:options:animations:completion:
通过动画的方式操作两个子VC
- (void)transitionFromViewController:(UIViewController *)fromViewController toViewController:(UIViewController *)toViewController duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
《iOS 中使用ViewController控制转场的各种方法》
-
shouldAutomaticallyForwardAppearanceMethods
是否将 appearance callbacks
事件传递给子VC
@property(nonatomic, readonly) BOOL shouldAutomaticallyForwardAppearanceMethods;
appearance callbacks
基本上指 viewWillDisappear,viewDidDisappear
之类方法。
默认为YES、你可以重载以禁用
- (BOOL)shouldAutomaticallyForwardAppearanceMethods { return NO; }
-
AppearanceTransition
调起指定的 appearance callbacks
- (void)beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated; - (void)endAppearanceTransition;
动传递的时候你并不能直接去调用 child
的 viewWillAppear
或者 viewDidAppear
这些方法,而是需要使用 beginAppearanceTransition:animated:
和 endAppearanceTransition
接口来间接触发那些appearance callbacks
且begin和end 必须成对出现
。
[content beginAppearanceTransition:YES animated:animated]
触发content的viewWillAppear
[content beginAppearanceTransition:NO animated:animated]
触发content的 viewWillDisappear
,
和他们配套的 [content endAppearanceTransition]
分别触发 viewDidAppear
和 viewDidDisappear
。
响应容器事件
-
– willMoveToParentViewController
将要添加到容器VC时调用
- (void)willMoveToParentViewController:(UIViewController *)parent;
将 BVC
通过 addChildViewController
给 A
、接口建立了逻辑上的父子关系, BVC
可以通过 parentViewController
,访问 AVC
, addChildViewController:
接口的逻辑中会自动调用 [BVC willMoveToParentViewController:self]
;
-
didMoveToParentViewController
从容器VC上移除时调用
- (void)didMoveToParentViewController:(UIViewController *)parent;
同上、在调用 removeFromParentViewController
时内部会调用 [BVC didMoveToParentViewController:nil]
获取其他控制器
-
presentingViewController && presentedViewController
presen
别人的控制器、被 presen
的控制器
@property(nonatomic, readonly) UIViewController *presentingViewController;//来自 @property(nonatomic, readonly) UIViewController *presentedViewController;//去往
假设从A控制器通过present的方式跳转到了B控制器,那么 A.presentedViewController 就是B控制器;B.presentingViewController 就是A控制器。
-
parentViewController
父VC
@property(nonatomic, weak, readonly) UIViewController *parentViewController;
-
navigationController
持有该VC的导航栏控制器
@property(nonatomic, readonly, strong) UINavigationController *navigationController;
-
splitViewController
持有该VC的分屏控制器
@property(nonatomic, readonly, strong) UISplitViewController *splitViewController;
-
tabBarController
持有该VC的tabBar控制器
@property(nonatomic, readonly, strong) UITabBarController *tabBarController;
处理内存警告
-
didReceiveMemoryWarning
当应用程序收到内存警告的时候会调用这个方法 ,做相应的解决内存警告的操作
- (void)didReceiveMemoryWarning;
必须调用super实现
协调系统手势
-
preferredScreenEdgesDeferringSystemGestures
协调系统边缘的滑动手势
@property(nonatomic, readonly) UIRectEdge preferredScreenEdgesDeferringSystemGestures;
有时候你的App需要控制从状态栏下拉或者底部栏上滑,这个会跟系统的下拉通知中心手势和上滑控制中心手势冲突。
如果你要优先自己处理手势可以将系统手势延迟。
-
childViewControllerForScreenEdgesDeferringSystemGestures
控制子试图控制器是否允许开发者控制edge protect的开启或是关闭
@property(nonatomic, readonly) UIViewController *childViewControllerForScreenEdgesDeferringSystemGestures;
如果实现了这个方法并且返回值不为空那么子VC的edge protect设置就会遵循父VC的设置,跟随父VC是否延迟执行系统手势。
管理状态栏
-
childViewControllerForStatusBarStyle
应该使用哪一个VC来确定状态栏的Style
@property(nonatomic, readonly) UIViewController *childViewControllerForStatusBarStyle;
以下解释转自 《iOS状态栏详解》
运用这个函数就可以解决嵌套 UINavigationController
设置样式无效的问题。
解释一下为什么嵌套 UINavigationController
的 viewController
的 preferredStatusBarStyle
函数设置无效:
在我们嵌套了 UINavigationController
的时候,我们的
AppDelegate.window.rootViewController
通常是我们创建的 navigationController
,这时首先会调用的是 navigationController
中的 childViewControllerForStatusBarStyle
函数,因为默认返回 nil
,那么接下来就会调用 navigationController
本身的 preferredStatusBarStyle
函数,所以我们在 viewController
中通过 preferredStatusBarStyle
函数设置的状态栏样式就不会被调用发现,所以也就无效了。
所以我们要自己创建一个继承于 UINavigationcontroller
的
NavigationController
,在这个子类中重写
childViewControllerForStatusBarStyle
函数
- (UIViewController *)childViewControllerForStatusBarStyle{ return self.topViewController; }
这样 navigationController
中的 childViewControllerForStatusBarStyle
函数会返回 navigationController
中最上层的 viewController
,那么 viewController
中的 preferredStatusBarStyle
函数的设置就会被系统获知。
-
childViewControllerForStatusBarHidden
应该使用哪一个VC来确定状态栏的显示/隐藏
@property(nonatomic, readonly) UIViewController *childViewControllerForStatusBarHidden;
函数的使用原理同上,不再赘述。
-
preferredStatusBarStyle
状态栏样式
@property(nonatomic, readonly) UIStatusBarStyle preferredStatusBarStyle;
UIStatusBarStyle
是一个枚举类型
typedef NS_ENUM(NSInteger, UIStatusBarStyle) { //默认样式,黑字透明状态栏,适合用于背景色为亮色的页面 UIStatusBarStyleDefault = 0, // Dark content, for use on light backgrounds //白字透明状态栏,适合用于背景色为暗色的页面 UIStatusBarStyleLightContent NS_ENUM_AVAILABLE_IOS(7_0) = 1, // Light content, for use on dark backgrounds // iOS7.0以前黑底白字,iOS7以后跟UIStatusBarStyleLightContent效果一样 UIStatusBarStyleBlackTranslucent NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 1, // iOS7.0以前启动页为灰底白字,iOS7以后跟UIStatusBarStyleLightContent效果一样 UIStatusBarStyleBlackOpaque NS_ENUM_DEPRECATED_IOS(2_0, 7_0, "Use UIStatusBarStyleLightContent") = 2, } __TVOS_PROHIBITED;
使用起来、需要在具体的VC中
- (UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
-
prefersStatusBarHidden
状态栏的显示/隐藏
@property(nonatomic, readonly) BOOL prefersStatusBarHidden;
使用起来、需要在具体的VC中
- (BOOL)prefersStatusBarHidden{ return YES; }
-
modalPresentationCapturesStatusBarAppearance
在非全屏的模态中、获得状态栏控制权
@property(nonatomic, assign) BOOL modalPresentationCapturesStatusBarAppearance;
-
preferredStatusBarUpdateAnimation
状态栏更新时的动画
@property(nonatomic, readonly) UIStatusBarAnimation preferredStatusBarUpdateAnimation;
重写此方法设置状态栏更新时候的动画
-
setNeedsStatusBarAppearanceUpdate
准备更新状态栏
- (void)setNeedsStatusBarAppearanceUpdate;
当你需要更新状态栏时、调用他。支持动画渐变
配置导航入口
-
navigationItem
分栏控制器按钮
@property(nonatomic, readonly, strong) UINavigationItem *navigationItem;
可以用来设置导航栏上的分栏按钮
UIBarButtonItem *rightItem = [[UIBarButtonItem alloc] initWithImage:[[UIImage imageNamed:@"nav_scan_icon.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] style:UIBarButtonItemStylePlain target:self action:@selector(rightItemAction)]; self.navigationItem.rightBarButtonItem = rightItem;
是 UINavigationItem
的唯一实例、通过懒加载的方式生产。
-
hidesBottomBarWhenPushed
在VC展示时、下方Tabbar是否隐藏
@property(nonatomic) BOOL hidesBottomBarWhenPushed;
通常都是在BaseViewController里设置成YES了。
-
toolbarItems
更改工具栏
- (void)setToolbarItems:(NSArray*)toolbarItems animated:(BOOL)animated; @property(nonatomic, strong) NSArray*toolbarItems;
-
tabBarItem
Tabbar上的按钮
@property(nonatomic, strong) UITabBarItem *tabBarItem;
编辑行为
-
editing
是否允许用户进行编辑
@property(nonatomic, getter=isEditing) BOOL editing;
-
setEditing:animated:
更新Edit|Done按钮item的外观
- (void)setEditing:(BOOL)editing animated:(BOOL)animated;
当设置 controller
的 editing
属性,会自动触发 setEditing:animated
属性,这个时候通过 myController editButtonItem
获得的编辑按钮会自动从 edit
变成 Done
,这个通常使用在 navigation Controller
-
editButtonItem
返回Edit|Done按钮。
@property(nonatomic, readonly) UIBarButtonItem *editButtonItem;
比如设置一个右上角按钮为editButton的话代码如下
myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];