A-A+

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

  • 职责
  1. 更新视图内容
  2. 响应交互
  3. 调整入口View布
  4. 与程序中其他对象(包括其他控制器)进行协调

UIViewController作为UIResponder、被插入响应链之间。如果其持有的视图中没有一个可以处理某事件、控制器可以选择自行处理或者传递给父视图。

控制器很少单独被使用、我们通常使用多个控制器进行相互的跳转作业。

  • 视图管理

根View主要充当视图层次结构的其余部分的容器。
根View的大小和位置由拥有它的对象决定,该对象要么是视图控制器,要么是应用程序的Window。
Window所拥有的视图控制器是应用程序的根View控制器,它的视图是用来填充Window的。

View属性是懒加载的、有几种方式可以指定ViewController的View:

  1. Storyboard
    可以指定视图及其与视图控制器的连接。
    你也指定视图控制器之间的关系和segue。
  2. Nib
    使用Nib文件为视图控制器指定单个视图控制器的视图。
    但不允许定义segue或视图控制器之间的关系。
  3. 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方法提供一些低内存条件的自动处理,这些方法释放不需要的内存。

  • 生命周期
  1. +[ViewController load]
  2. +[ViewController initialize]
  3. -[ViewController init]
  4. -[ViewController loadView]
  5. -[ViewController viewDidLoad]
  6. -[ViewController viewWillAppear:]
  7. -[ViewController updateViewConstraints]
  8. -[ViewController viewWillLayoutSubviews]
  9. -[ViewController viewDidLayoutSubviews]
  10. -[ViewController viewDidAppear:]
  11. -[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;

  1. 这个属性是来加载的、当你访问时如果为nil、将调用loadView方法并返回view
  2. 每一个VC、都必须是该View的唯一一个持有者。(例外情况是通过addChildViewController:方法添加后、将vc.view add给另一个vc)
  3. 你可以通过isViewLoaded方法来检测当前vc是否已经持有视图。(这样不会触发懒加载)。
  4. VC有权在低内存情况下以及VC最终释放时、释放这个属性。
  • viewLoaded


self.view是否有值


@property(nonatomic, readonly, getter=isViewLoaded) BOOL viewLoaded;

这个属性的检测不会触发view属性的懒加载。

  • - loadView


创建容器视图


- (void)loadView;

view属性被访问但本身没有值时触发、你可以在这里自定义view属性的视图。

  1. 永远不要直接调用这个方法。
  2. 如果使用nib、该方法从nib中加载视图。如果不是、则直接创建一个UIView
  3. 如果使用IB来创建VC、不要覆盖这个方法。
  4. 如果自定义view。您创建的视图应该是唯一的实例,不应该与任何其他视图控制器对象共享。此方法的自定义实现不应调用super。
  5. 如果想对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.titlenavigationItem.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 , };

  • modalPresentationStyle


设置过渡动画样式


@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;

  1. 当前界面是Nav的子VC时
    它会用push方式切换。
  2. 当前界面为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值产生影响。以便正常显示。
有兴趣可以看看

  • - 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<__kindof UIViewController *> *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;

  • 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;

动传递的时候你并不能直接去调用childviewWillAppear或者viewDidAppear这些方法,而是需要使用 beginAppearanceTransition:animated:endAppearanceTransition接口来间接触发那些appearance callbacks
且begin和end必须成对出现

[content beginAppearanceTransition:YES animated:animated]触发content的viewWillAppear
[content beginAppearanceTransition:NO animated:animated]触发content的viewWillDisappear
和他们配套的[content endAppearanceTransition]分别触发viewDidAppearviewDidDisappear


响应容器事件

  • - willMoveToParentViewController

将要添加到容器VC时调用


- (void)willMoveToParentViewController:(UIViewController *)parent;

BVC通过addChildViewControllerA、接口建立了逻辑上的父子关系,BVC可以通过parentViewController,访问AVCaddChildViewController:接口的逻辑中会自动调用 [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设置样式无效的问题。

解释一下为什么嵌套UINavigationControllerviewControllerpreferredStatusBarStyle函数设置无效:
在我们嵌套了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;

modalPresentationCapturesStatusBarAppearance是专门为强迫症患者量身定制的,只需要重写这个属性并返回true,你就可以在任何形式的Model Presentation中获得对 Status Bar Style的控制权了。

  • 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<UIBarButtonItem *> *)toolbarItems animated:(BOOL)animated; @property(nonatomic, strong) NSArray<__kindof UIBarButtonItem *> *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;

当设置controllerediting属性,会自动触发setEditing:animated属性,这个时候通过myController editButtonItem获得的编辑按钮会自动从edit变成Done,这个通常使用在navigation Controller

  • editButtonItem

返回Edit|Done按钮。


@property(nonatomic, readonly) UIBarButtonItem *editButtonItem;

比如设置一个右上角按钮为editButton的话代码如下

myViewController.navigationItem.rightBarButtonItem=[myViewController editButtonItem];

给我留言

Copyright © ios教程,苹果粉丝,苹果资讯,ios入门教程,ios学习,ios程序员,ios视频教程,ios粉丝网 保留所有权利.   Theme  Ality

用户登录