ios ios开发添加子控制器中怎么更换跟控制器

iOS开发过程中怎么知道当前视图控制器是怎么来的? - 知乎6被浏览3278分享邀请回答/*
These four methods can be used in a view controller's appearance callbacks to determine if it is being
presented, dismissed, or added or removed as a child view controller. For example, a view controller can
check if it is disappearing because it was dismissed or popped by asking itself in its viewWillDisappear:
method by checking the expression ([self isBeingDismissed] || [self isMovingFromParentViewController]).
- (BOOL)isBeingPresented NS_AVAILABLE_IOS(5_0);
- (BOOL)isBeingDismissed NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingToParentViewController NS_AVAILABLE_IOS(5_0);
- (BOOL)isMovingFromParentViewController NS_AVAILABLE_IOS(5_0);
有一点需要注意的是如果你是 present 到一个 UINavigationController 的时候,你应该使用后两个方法。还有别的方法,比如检查 push 或 pop 可以实现 UINavigationController 的代理方法:- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
检测 present 或 dismissed 可以逐级检查 UIViewController 的 presentingViewController 属性等。------------------------------------------------------------------------吐槽一下不支持 MarkDown 真是对标记短代码很不友好。1添加评论分享收藏感谢收起0添加评论分享收藏感谢收起写回答iOS控制器View加载顺序详细版
招聘信息:
加载过程:1 一般情况下调用 init方法或者调用initWithNibName方法实例化UIViewController, 不管调用哪个方法都为调用initWithNibName(方法定义如下)-&(id)initWithNibName:(NSString&*)nibNameOrNil&bundle:(NSBundle&*)nibBundleOrNil2 接着会调用loadView方法来生成UIViewController.view-&(void)loadView下面来简单说下loadView底层2.1.1.判断下有没有指定storyboard,如果有,就去加载storyboard描述的控制器的view 2.1.2.判断下有没有指定nibName,如果有,就去加载nibName描述的控制器的view&&&-&(instancetype)initWithNibName:(NSString&*)nibNameOrNil&bundle:(NSBundle&*)nibBundleOrNil如果判断有没有指定nibName,[self nibName] 2.1.3判断下nibName是否为空,如果为空,他会尝试找下有没有跟控制器同名,但是不带Controller的xib 2.1.4跟控制器同名的xib,nibName = ViewController,但是这一步有条件,前提条件你没有重写loadView 2.1.5如果都没有找到,直接创建默认控制器的view3 - (void)awakeFromN这个方法用的时候,outlet还没有连接起来,是view Controller刚从storyboard建的时候,没有完全建好,不过可能有一些事情要在这个方法里面完成,比如splitViewDelegate,需要在非常早期完成。然后调用 viewDidLoad方法 4 &- (void)viewDidLoad如果loadView不能生成UIViewController.view系统将会反复调用loadView及viewDidLoad方法, 并且最终调用[super loadView] 方法返回UIViewController.view然后依次调用如下2个方法, 这2个方法也十分重要, 在UINavigationController的POP操作后有时将要显示的UIViewController中的View并没有释放(也有可能释放掉) , UIViewController将不会调用上面的三个方法(initWithNibName,loadView,viewDidLoad) 而会调用下面这2个方法 &5 &- (void)viewWillAppear:(BOOL)6 &- (void)viewDidAppear:(BOOL)紧接着调用下面两个方法view中frame值布局,使子控制器的frame值更加准确 & 7 &- (void)viewWillLayoutSubviews & 8 -(void)viewDidLayoutSubviews9 卸载过程-&(void)viewWillDisappear:(BOOL)
-&(void)viewDidDisappear:(BOOL)
-&(void)viewWillU//iOS5.0添加-&(void)viewDidU
-&(void)dealloc;控制器View一些方法的区分viewDidLoad其实没什么可混淆的,无论通过什么途径加载(Xcode或者IB,这里的加载属于实例化)完view后肯定会执行这个方法.loadView需要分两种情况.当你通过Xcode实例化一个类的时候就需要自己在controller中实现这个方法.而在IB中实例化就不需要实现它.initWithNibName这个方法是在controller的类在IB中创建,但是通过Xcode实例化controller的时候用的.awakeFromNib这个方法是一个类在IB中被实例化是被调用的.看了帖子发现大家都推荐使用viewDidLoad而不要使用awakeFromNib,应为viewDidLoad会被多次调用,而awakeFromNib只会当从nib文件中unarchive的时候才会被调用一次.实际测试中发现,当一个类的awakeFromNib被调用的时候,那么这个类的viewDidLoad就不会被调用了,这个感觉很奇怪.initWithCoder是一个类在IB中创建但在Xcode中被实例化时被调用的.比如,通过IB创建一个controller的nib文件,然后在xocde中通过initWithNibName来实例化这个controller,那么这个controller的initWithCoder会被调用.awakeFromNib 当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。也就是说通过nib文件创建view对象是执行awakeFromNibviewDidLoad 当view对象被加载到内存是就会执行viewDidLoad,所以不管通过nib文件还是代码的方式创建对象都会执行viewDidLoad文章转自
微信扫一扫
订阅每日移动开发及APP推广热点资讯公众号:CocoaChina
您还没有登录!请或
点击量6265点击量4590点击量4565点击量3500点击量2909点击量2409点击量2381点击量2351点击量2333
&2016 Chukong Technologies,Inc.
京公网安备89iOS开发项目篇—02添加子控制器以及项目分层
时间: 18:39:17
&&&& 阅读:3261
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&iOS开发项目篇&02添加子控制器以及项目分层
一、添加子控制器
1.设置根控制器(自定义)
说明:分析新浪微博应用,观察其整体建构层次。而系统的控制器不能满足项目开发的需求,这里把项目中原有的控制器删除.
自己定义一个TabBarViewController类。让这个类作为window窗口的根控制器。
YYAppDelegate.m文件代码:
1 #import "YYAppDelegate.h"
2 #import "YYTabBarViewController.h"
4 @implementation YYAppDelegate
6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
//1.创建窗口
self.window=[[UIWindow alloc]init];
self.window.frame=[UIScreen mainScreen].
//2.设置窗口的根控制器
UITabBarController *tabbarVc =[[UITabBarController alloc]init];
self.window.rootViewController=tabbarVc;
self.window.rootViewController=[[YYTabBarViewController alloc]init];
//3.显示窗口
[self.window makeKeyAndVisible];
return YES;
2.新建四个自定义的控制器
说明:根据功能模块划分,把该项目划分为四个大的部分,分别是首页、消息、发现和&我&,根据项目需要,自定义四个子控制器,对这四个模块分别进行管理。
自定义四个控制器,让其继承自UITableViewController
在中控制器 (YYTabBarViewController)中,添加四个子控制器
3.拷贝需要的图片素材到项目中
建议:在拷贝图片的时候,建议使用硬盘对硬盘的拷贝,即在finder中进行。
4.修改系统插件
在项目中,经常会使用到分类(如本项目中使用了一个自己定义UIImage的匪类),但是使用这种分类的方法时,我们安装的只能提示插件可能并不会有智能提示,那么这种情况下可以尝试修改插件。
(1)找到插件在XCode中的安装路径
提示:Xcode的插件安装路径:&/Users/用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins
(2)显示包内容
(3)修改plist文件
二、实现代码
YYTabBarViewController.m文件
YYTabBarViewController.m
02-微博添加子控制器和设置项目结构
Created by apple on 14-7-3.
Copyright (c) 2014年 itcase. All rights reserved.
9 #import "YYTabBarViewController.h"
10 #import "YYHomeTableViewController.h"
11 #import "YYDiscoverViewController.h"
12 #import "YYMessageViewController.h"
13 #import "YYProfileViewController.h"
14 #import "UIImage+Extension.h"
16 @interface YYTabBarViewController ()
20 @implementation YYTabBarViewController
23 - (void)viewDidLoad
[super viewDidLoad];
//添加四个子控制器
YYHomeTableViewController *home=[[YYHomeTableViewController alloc]init];
[self addOneChildVc:home title:@"首页" imageName:@"tabbar_home" selectedImageName:@"tabbar_home_selected"];
YYMessageViewController *message=[[YYMessageViewController alloc]init];
[self addOneChildVc:message title:@"消息" imageName:@"tabbar_message_center" selectedImageName:@"tabbar_message_center_selected"];
YYDiscoverViewController *discover=[[YYDiscoverViewController alloc]init];
[self addOneChildVc:discover title:@"发现" imageName:@"tabbar_discover" selectedImageName:@"tabbar_discover_selected"];
YYProfileViewController *profile=[[YYProfileViewController alloc]init];
[self addOneChildVc:profile title:@"我" imageName:@"tabbar_profile" selectedImageName:@"tabbar_profile_selected"];
添加一个子控制器
@param childVC
子控制对象
@param title
@param imageName
@param selectedImageName 选中时的图标
49 -(void)addOneChildVc:(UIViewController *)childVc title:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName
//随机设置子控制器的背景颜色
childVc.view.backgroundColor=YYRandomC
//设置标题
childVc.tabBarItem.title=
//设置图标
childVc.tabBarItem.image=[UIImage imageWithName:imageName];
//设置选中时的图标
UIImage *selectedImage=[UIImage imageWithName:selectedImageName];
if (iOS7) {
// 声明这张图片用原图(别渲染)
selectedImage = [selectedImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
childVc.tabBarItem.selectedImage = selectedI
//添加子控制器到tabbar
[self addChildViewController:childVc];
73 // 在iOS7中, 会对selectedImage的图片进行再次渲染为蓝色
74 // 要想显示原图, 就必须得告诉它: 不要渲染
76 // Xcode的插件安装路径: /Users/用户名/Library/Application Support/Developer/Shared/Xcode/Plug-ins
UIImage分类
UIImage+Extension.h文件
UIImage+Extension.h
Created by apple on 14-7-3.
Copyright (c) 2014年 heima. All rights reserved.
9 #import &UIKit/UIKit.h&
11 @interface UIImage (Extension)
12 + (UIImage *)imageWithName:(NSString *)
UIImage+Extension.m文件
UIImage+Extension.m
Created by apple on 14-7-3.
Copyright (c) 2014年 heima. All rights reserved.
9 #import "UIImage+Extension.h"
11 @implementation UIImage (Extension)
12 + (UIImage *)imageWithName:(NSString *)name
UIImage *image =
if (iOS7) { // 处理iOS7的情况
NSString *newName = [name stringByAppendingString:@"_os7"];
image = [UIImage imageNamed:newName];
if (image == nil) {
image = [UIImage imageNamed:name];
在配置文件中的宏定义
Prefix header
The contents of this file are implicitly included at the beginning of every source file.
7 #import &Availability.h&
9 #ifndef __IPHONE_5_0
10 #warning "This project uses features only available in iOS SDK 5.0 and later."
13 #ifdef __OBJC__
#import &UIKit/UIKit.h&
#import &Foundation/Foundation.h&
17 // 随机色
18 #define YYRandomColor [UIColor colorWithRed:arc4random_uniform(256)/255.0 green:arc4random_uniform(256)/255.0 blue:arc4random_uniform(256)/255.0 alpha:1.0]
20 // 是否为iOS7
21 #define iOS7 ([[UIDevice currentDevice].systemVersion doubleValue] &= 7.0)
运行情况:
三、规划项目文件结构
该项目的开发以模块进行划分,文件结构如下:
提示:在进行结构划分的时候,可以在项目中新建分组,分组完成后,把相应的文件拖到对应的组中,但分组是虚拟文件夹,通过查看代码的文件可以发现,在硬盘上实质上是没有分文件夹的。
建议:直接在硬盘中进行分组,以解决这个问题。
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/panyangjun/p/4318757.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!生命周期方法  控制器从创建到销毁方法的执行顺序  load->initialize->init(initWithNibName)—>loadView—>viewDidLoad—>viewWillApper—>viewDidApper—>viewWillDisapper—>viewDidDisapper—>viewWillUnload->viewDidUnload—>dealloc  其中viewWillUnload跟viewDidUnLoad 在iOS6以后就过期了.  收到low-memory时系统不会释放view,而只是释放controller的resource。  LoadView: 控制器调用loadView方法创建控制器的view.当控制器的view存在了就不会调用.  不要再LoadView中调用[super loadView],会影响CPU性能  苹果官方文档  You should never call this method directly. The view controller calls this method when its view property is requested but is currently nil. This method loads or creates a view and assigns it to the view property.  当系统要展示这个控制器view的时候,会先去view的getter方法中寻找有没有返回view,如果view == nil,系统就会主动去调用这个方法.  控制器的view都是懒加载,当需要展示的时候才会去创建  懒加载:重写getter方法  好处:不用管什么时候需要创建,做到要用时再创建  view的加载过程  view的加载过程  从代码中加载view  代码创建  从storyboard/xib中加载view  从storyboard/xib中加载view  实现过程  一旦重写了loadView,表示需要自己创建控制器的View.  3.2 如果控制器的View还没有赋值,就不能调用控制器View的get方法.会造成死循环.  因为控制器View的get方法底层会调用loadView方法.  先去判断当前控制器是不是从StoryBoard当中加载的,如果是,那么它就会从StoryBoard当中加载控制器的View.  如果不是从StoryBoard当中加载的, 那么它还会判断是不是从Xib当中创建的控制器.  如果是,那么它就会从xib加载控制器的View.  如果也不是从Xib加载的控制器.那么它就会创建一个空的UIView.设为当前控制器的View.  注意点:  viewDidLoad: 当控制器View加载完毕时调用  我们经常会在这个方法里面做一些控件的初始化操作,其中可能会给一些控件设置尺寸位置,但是需要注意的是在这个方法内只能参照控制器的view的尺寸,不能参照其他子控件的尺寸  viewWillAppear: 视图将要显示的时候调用  viewWillLayoutSubviews: viewWillLayoutSubviews即将对子控件进行布局  viewDidLayoutSubviews:当控制器View布局子控件完毕时调用  可以在此方法中可以用子控件的尺寸做参考  在这个方法内真正做一些控件布局的操作,可以拿到控件尺寸.  不管是从xib,strongBoard,代码中加载的控件,willAppear之后都会调用这个方法,方法调用很频繁  viewDidAppear:当控制器View显示完毕时调用  viewWillDisappear:当控制器View既将消失时调用  viewDidDisappear:当控制器View消失完毕时调用  dealloc: 视图被销毁,此处需要对你在init和viewDidLoad中创建的对象进行释放  在这个方法内,我们通常会把添加在控制器内的一些东西给移出.例如:KVO监听者,HUD,定时器等  didReceiveMemoryWarning: 当收到系统发出的内存警告时调用,我们可以截获系统发出的内存警告然后做一些是自定义事情  收到内存警告系统执行步骤  Paste_Image.png  类  load:当一个类被加载时调用,只加载一次  initialize:当本类或者子类被加载时调用,可能调用多次  init:用代码创建类的时候调用,只能做一些初始化操作,不能设置控件的frame,init其实是去调用initWithFrame,只不过frame为CGRectZero  initWithFrame:用代码创建类的时候调用,只能做一些初始化操作,不能在这设置控件的frame,如果已经知道了frame,那么在这里设置子控件的frame是没有问题的,但是如果外界使用init的方式创建,最终也会调用initWithFrame方法,此时的frame传进来是0,那么,在这个方法里面设置的子控件的frame也会为0.所以,为了严谨起见,最好不要在这个方法里面设置子控件的frame.  initWithCoder:从xib/storyboard中加载就会调用此方法,只能在这个方法做一些一次性设置,不能设置控件的frame  awakeFromNib:从文件中加载.就会调用此方法,可以在这个方法中设置frame  layoutSubviews:布局本类或者子控件时调用,调用频率频繁,通常在这里设置子控件的位置  addSubviews  滚动scrollView  旋转Screen会触发父类的layouSubviews  ....  You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want.  当我们在某个类的内部调整子视图位置时,需要调用。反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写  注意:一定要在[super layoutSubviews];之后进行设置控件的frame  苹果官方文档  如果没有先调用[super layoutSubviews];可能设置了frame,控件也不会显示  可能触发layoutSubviews的情况
TA的最新馆藏
喜欢该文的人也喜欢iOS开发中标签控制器的使用——UITabBarController
iOS开发中标签控制器的使用——UITabBarController
与导航控制器相类似,标签控制器也是用于管理视图控制器的一个UI控件,在其内部封装了一个标签栏,与导航不同的是,导航的管理方式是纵向的,采用push与pop切换控制器,标签的管理是横向的,通过标签的切换来改变控制器,一般我们习惯将tabBar作为应用程序的根视图控制器,在其中添加导航,导航中在对ViewController进行管理。
二、创建一个标签控制器
通过如下的步骤,我们可以很简便的创建一个TabBarController:
UITabBarController * tabBar= [[UITabBarController alloc]init];
NSMutableArray * controllerArray = [[NSMutableArray alloc]init];
for (int i=0; i&4; i++) {
UIViewController * con = [[UIViewController alloc]init];
[con loadViewIfNeeded];
con.view.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
con.tabBarItem.image = [UIImage imageNamed:@"btn_publish_face_a.png"];
con.tabBarItem.title=[NSString stringWithFormat:@"%d",i+1];
con.title = [NSString stringWithFormat:@"%d",i+1];
[controllerArray addObject:con];
tabBar.viewControllers = controllerA
[self presentViewController:tabBar animated:YES completion:nil];
通过点击下面的标签按钮,可以很方便的切换控制器。如果我们的控制器数超过4个,系统会被我们创建一个more的导航,并且可以通过系统自带的编辑来调整控制器的顺序,如下:
三、UITabBarController的属性和方法
//管理的viewController数组
@property(nullable, nonatomic,copy) NSArray&__kindof UIViewController *& *viewC
- (void)setViewControllers:(NSArray&__kindof UIViewController *& * __nullable)viewControllers animated:(BOOL)
//选中的ViewControlle
@property(nullable, nonatomic, assign) __kindof UIViewController *selectedViewC
//通过编号设置选中ViewController
@property(nonatomic) NSUInteger selectedI
//当viewController大于4个时,获取"更多"标签的导航控制器
@property(nonatomic, readonly) UINavigationController *moreNavigationC
//这个属性设置的是可以进行自定义排列顺序的视图控制器,如上面第二张图中的,默认是全部
@property(nullable, nonatomic, copy) NSArray&__kindof UIViewController *& *customizableViewC
//标签控制器中分装的标签栏
@property(nonatomic,readonly) UITabBar *tabBar NS_AVAILABLE_IOS(3_0);
@property(nullable, nonatomic,weak) id&UITabBarControllerDelegate&
四、关于标签栏TabBar
通过自定义标签栏的一些属性,使我们可以更加灵活的使用tabBar。
1、UITabBar属性和方法
设置标签:
@property(nullable,nonatomic,copy) NSArray&UITabBarItem *& *
//设置选中的标签
@property(nullable,nonatomic,assign) UITabBarItem *selectedI
- (void)setItems:(nullable NSArray&UITabBarItem *& *)items animated:(BOOL)
设置自定义标签顺序:
//调用这个方法会弹出一个类似上面第二张截图的控制器,我们可以交换标签的布局顺序
- (void)beginCustomizingItems:(NSArray&UITabBarItem *& *)
//完成标签布局
- (BOOL)endCustomizingAnimated:(BOOL)
//是否正在自定义标签布局
- (BOOL)isC
设置tabBar颜色相关:
//设置渲染颜色,会影响选中字体和图案的渲染
@property(null_resettable, nonatomic,strong) UIColor *tintC
//设置导航栏的颜色
@property(nullable, nonatomic,strong) UIColor *barTintC
设置背景图案:
//设置导航栏背景图案
@property(nullable, nonatomic,strong) UIImage *backgroundI
//设置选中一个标签时,标签背后的选中提示图案 这个会出现在设置的item图案的后面
@property(nullable, nonatomic,strong) UIImage *selectionIndicatorI
//设置阴影的背景图案
@property(nullable, nonatomic,strong) UIImage *shadowImage
TabBar中标签的宏观属性:
//设置标签item的位置模式
@property(nonatomic) UITabBarItemPositioning itemP
//枚举如下
typedef NS_ENUM(NSInteger, UITabBarItemPositioning) {
UITabBarItemPositioningAutomatic,//自动
UITabBarItemPositioningFill,//充满
UITabBarItemPositioningCentered,//中心
} NS_ENUM_AVAILABLE_IOS(7_0);
//设置item宽度
@property(nonatomic) CGFloat itemW
//设置item间距
@property(nonatomic) CGFloat itemS
与导航栏类似,也可以设置tabBar的风格和透明效果:
//风格 分黑白两种
@property(nonatomic) UIBarStyle barS
//是否透明效果
@property(nonatomic,getter=isTranslucent) BOOL
2、UITabBarDelegate
//选中标签时调用
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)
//将要开始编辑标签时
- (void)tabBar:(UITabBar *)tabBar willBeginCustomizingItems:(NSArray&UITabBarItem *& *)
//已经开始编辑标签时
- (void)tabBar:(UITabBar *)tabBar didBeginCustomizingItems:(NSArray&UITabBarItem *& *)
//将要进入编辑状态时
- (void)tabBar:(UITabBar *)tabBar willEndCustomizingItems:(NSArray&UITabBarItem *& *)items changed:(BOOL)
//已经进入编辑状态时
- (void)tabBar:(UITabBar *)tabBar didEndCustomizingItems:(NSArray&UITabBarItem *& *)items changed:(BOOL)
五、再看UITabBarItem
和NavigationItem类似,标签栏上的item也可以自定义,一些方法如下。
初始化方法:
//通过标题和图案进行创建
- (instancetype)initWithTitle:(nullable NSString *)title image:(nullable UIImage *)image tag:(NSInteger)
- (instancetype)initWithTitle:(nullable NSString *)title image:(nullable UIImage *)image selectedImage:(nullable UIImage *)selectedI
//创建系统类型的
- (instancetype)initWithTabBarSystemItem:(UITabBarSystemItem)systemItem tag:(NSInteger)
UITabBarSystemItem的枚举如下:
typedef NS_ENUM(NSInteger, UITabBarSystemItem) {
UITabBarSystemItemMore,//更多图标
UITabBarSystemItemFavorites,//最爱图标
UITabBarSystemItemFeatured,//特征图标
UITabBarSystemItemTopRated,//高级图标
UITabBarSystemItemRecents,//最近图标
UITabBarSystemItemContacts,//联系人图标
UITabBarSystemItemHistory,//历史图标
UITabBarSystemItemBookmarks,//图书图标
UITabBarSystemItemSearch,//查找图标
UITabBarSystemItemDownloads,//下载图标
UITabBarSystemItemMostRecent,//记录图标
UITabBarSystemItemMostViewed,//全部查看图标
UITabBarItem常用属性:
//设置选中图案
@property(nullable, nonatomic,strong) UIImage *selectedI
下面这个属性可以设置item的头标文字:
con.tabBarItem.badgeValue = @"1";
//设置标题的位置偏移
@property (nonatomic, readwrite, assign) UIOffset titlePositionA
由于UITabBarItem是继承于UIBarItem,还有下面这个属性可以设置使用:
@property(nullable, nonatomic,copy)
@property(nullable, nonatomic,strong)
//横屏时的图案
@property(nullable, nonatomic,strong)
*landscapeImageP
//图案位置偏移
@property(nonatomic)
UIEdgeInsets imageI
//横屏时的图案位置偏移
@property(nonatomic)
UIEdgeInsets landscapeImagePhoneI
//设置和获取标题的字体属性
- (void)setTitleTextAttributes:(nullable NSDictionary&NSString *,id& *)attributes forState:(UIControlState)
- (nullable NSDictionary&NSString *,id& *)titleTextAttributesForState:(UIControlState)

我要回帖

更多关于 ios开发菜单控制器 的文章

 

随机推荐