您的位置:首页 > 移动开发 > IOS开发

8、iOS 开发之多控制器管理

2015-08-29 03:50 393 查看
控制器UIViewController的两个属性

tabBarItem和navigationItem
tabBarItem-->UITabBarController
navigation-->UINavigationController


一、控制器的创建方式

1.”通过storyboard方式创建

1> 先加载storyboard文件

UIStoryboard * storyboard = [UIStoryboard storyboardWithName:@"Test" bundle:nil];


2> 初始化storyboard控制器

// 初始化箭头所指控制器
WBViewController *wb = [storyboard instantiateInitialViewController];
// 通过一个标识初始化对应的控制器
WBViewController *wb = [storyboard instantiateViewControllerWithIdentifier:@"wb"];


2.”直接创建

WBViewController *wb = [[WBViewController alloc] init];

* 在loadview方法里面添加一些控件

3.”通过关联xib创建

* 通过xib创建的视图控制器是有优先级的
* xib的细节:xib的"File's Owner"代表着界面由哪个类来管理,必须指定"File's Owner"的class,然后"File's Owner"的 view 与xib进行连线"此处一定要谨记"


1> 用initWithNibName:指定xib创建(此时xib的名称不受限制)

// xib的名字不受限制,可以与类名不一致
WBViewController *wb = [[WBViewController alloc] initWithNibName:@"WBViewControlller" bundle:nil];


2> 不指定xib的匹配方式

// 只识别两种,优先匹配WBView.xib,在匹配WBViewController.xib
WBViewController *wb = [[WBViewController alloc] init];


4.”视图控制器View的创建流程”

1> 根据loadView中的代码去创建
2> 根据storyboard的描述去创建
3> 根据nibName对应xib的描述去创建
4> 根据WBView.xib的描述去创建
5> 根据WBViewController.xib的描述去创建
6> 创建一个空的view


二、UINavigationController的使用

1.”UINavigationController的使用步骤

// 初始化UINavigationController
UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:one];
// 设置根控制器
self.window.rootViewController = nav;
// 添加子控制器
[nav addChildViewController:one];
[nav pushViewController:one animated:YES];
nav.viewControllers = @[one];


2.”UINavigationController的子控制器”

1> 属性

@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;


2> 方法

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;


补充:

pushViewController:方法可以对添加到栈中的控制器进行”拦截”,通过拦截可以对viewController进行设置,达到统一的效果

当然,在控制器的自身的方法viewDidLoad方法中,可以对拦截设置的效果进行覆盖,

方法的执行顺序:pushViewController–> viewDidLoad

三、UINavigationBar内容的设置

UINavigationItem的属性

// 下一个视图的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
// 中间标题的视图
@property(nonatomic,retain) UIView          *titleView;
// 中间标题的文字
@property(nonatomic,copy)   NSString        *title;
// 左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
// 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;


四、控制器的生命周期

1.生命周期的几个方法(”次序同时也是生命周期执行的顺序”)

// 加载view
loadView
// 加载完毕
viewDidLoad
// 将要显示
viewWillAppear
// 已经显示
viewDidAppear
// 将要消失
viewWillDisappear
// 已经消失
viewDidDisappear
// 内存警告
didReceiveMemoryWaring
// 即将被卸载
viewWillUnload
// 清空
dealloc
// 卸载完毕
viewDidUnload


五、Segue的使用

storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象

1.Segue的属性

// 唯一标识
@property (nonatomic,readonly) NSString *identifier;
// 来源控制器
@property (nonatomic,readonly) id sourceViewController;
// 目标控制器
@property (nonatomic,readonly) id destinationViewController;


2.segue的类型

1> 自动型:点击控件后自动跳转

使用的场合:不需要任何的判断,直接跳到下一个界面
* 按住"control"直接从"控件"拖线到目标控制器


2> 手动型:需要手动写代码执行Segue

使用的场合:点击控件后,需要做一些判断,满足条件才会跳转
* 按住"control",从"源控制器"拖线到目标控制器
* Segue需要设置一个标识
* 使用perform方法执行对应identifier标识的segue
// self是源控制器
[self performSegueWithIdentifier:@"login2contacts" sender:nil];


3.performSegueWithIdentifier:sender:的执行过程

1> 根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象,设置源控制器和目标控制器

2> 为跳转做准备

// 这个sender是performSegueWithIdentifier:sender:的sender
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;


3> 调用Segue对象的- (void)perform;方法执行界面跳转

六、控制器数据的传递

1.顺传

在源控制器的perpareForSegue:sender:方法中根据segue参数获得目标控制器,直接传递数据过去

2.逆传

源控制器成为目标控制器的

七、UITabBarController

UITabBarController控制器包含:UITabBar和UITabBarController的View,添加的viewController会覆盖掉这个View

1.UITabBar

1> 如果UITabBarController有N个子控制器,那么UITabBar内部就会有N个UITabBarButton作为子控件
2> UITabbarButton里面显示的内容由对应子控制器的tabBarItem属性决定


2.UITabBarItem的属性

@property(nonatomic,copy) NSString *title;
@property(nonatomic,retain) UIImage *image;
@property(nonatomic,retain) UIImage *selectedImage;
// 提醒数字
@property(nonatomic,copy) NSString *badgeValue;


3.使用步骤:

代码实现

// 初始化tabbar控制器
UITabBarController *tabbarVc = [[UITabBarController alloc] init];
// 设置为window的跟控制器
self.window.rootViewController = tabbarVc;
// 添加子控制器
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor redColor];
vc1.tabBarItem.title = @"联系人";
vc1.tabBarItem.image = [UIImage imageNamed:@"tab_buddy_nor"];
[tabbarVc addChildViewController:vc1];


补充:

// 设置字体的样式
- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state;


例子:

NSMutableDictionary * textDict = [NSMutableDictionary dictionary];
textDict[NSForegroundColorAttributeName] = WBColor(123, 123, 123);
[vc.tabBarItem setTitleTextAttributes:textDict forState:UIControlStateNormal];

// 控制器底部的tabBar隐藏
viewController.hidesBottomBarWhenPushed = YES;


storyboard实现

1> 添加跟控制器UITabBarController
2> 添加UINavigationController控制器
3> 右键TabbarController,添加view controller
4> 设置子控制器的UITabBarItem的属性


八、Modal

任何控制器都能通过Modal的形式展示,效果是新控制器从屏幕底部向上钻,直到覆盖原来的控制器

// 以modal形式展示
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion

// 关闭当初的modal出来的控制器
- (void)dismissViewControllerAnimated: (BOOL)flag completion: (void (^)(void))completion;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: