UINavigationController——导航控制器
一、UINavigationController的使用步骤
1. 初始化 UINavigationController
2. 设置UIWindow的rootViewController为UINavigationController
3. 根据具体情况,通过push方法添加对应个数的子控制器
二、UINavigationController的子控制器
UINavigationController以栈的形式保存子控制器
@property(nonatomic,copy) NSArray *viewControllers;
@property(nonatomic,readonly) NSArray *childViewControllers;
使用push方法能将某个控制器压入栈
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
使用pop方法可以移除控制器将栈顶的控制器移除
- (UIViewController *)popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器
- (NSArray *)popToViewController:(UIViewController *)viewController animated:(BOOL)animated;
回到根控制器(栈底控制器)
- (NSArray *)popToRootViewControllerAnimated:(BOOL)animated;
三、如何修改导航栏的内容
导航栏的内容由栈顶控制器的navigationItem属性决定
UINavigationItem有以下属性影响着导航栏的内容
左上角的返回按钮
@property(nonatomic,retain) UIBarButtonItem *backBarButtonItem;
中间的标题视图
@property(nonatomic,retain) UIView *titleView;
中间的标题文字
@property(nonatomic,copy) NSString *title;
左上角的视图
@property(nonatomic,retain) UIBarButtonItem *leftBarButtonItem;
UIBarButtonItem *rightBarButtonItem 右上角的视图
@property(nonatomic,retain) UIBarButtonItem *rightBarButtonItem;
导航栏上的标题是由栈顶控制器决定的,导航栏上的 “返回”是由上一个决定的
-(void)viewDidLoad{
[super viewDidLoad];
//第一个控制器的标题显示
self.navigationItem.title = @"第一个控制器";
//第二个控制器上显示
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStylePlain target:nil action:nil];
}
四、使用UINavigationController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
// 1.创建导航控制器
UINavigationController *nav = [[UINavigationController alloc] init];
// 2.设置导航控制器为window的根控制器
self.window.rootViewController = nav;
// 创建第一个控制器并添加到导航控制器中
NJOneViewController *one = [[NJOneViewController alloc] init];
[nav pushViewController:one animated:YES];
/*
// 3.添加子控制器到导航控制器中
// 创建一些子控制器
UIViewController *vc1 = [[UIViewController alloc] init];
vc1.view.backgroundColor = [UIColor redColor];
UIViewController *vc2 = [[UIViewController alloc] init];
vc2.view.backgroundColor = [UIColor greenColor];
UIViewController *vc3 = [[UIViewController alloc] init];
vc3.view.backgroundColor = [UIColor purpleColor];
// 添加子控制器到导航控制器中
[nav pushViewController:vc1 animated:YES];
[nav pushViewController:vc2 animated:YES];
[nav pushViewController:vc3 animated:YES];
*/
[self.window makeKeyAndVisible];
return YES;
}
- (IBAction)jump2Two:(id)sender {
// 1.创建第二个控制器
NJTwoViewController *two = [[NJTwoViewController alloc] init];
// 2.将第二个控制器添加到导航控制器中
// 只要当前控制器是导航控制器的子控制器,就快要通过该属性直接获取到当前控制器所在的导航控制器
[self.navigationController pushViewController:two animated:YES];
}
五、图示
六、使用Storyboard实现的图示
代码能做的,Storyboard不一定都能做,下面的第三个返回到第二个,使用的是代码
- (IBAction)xmBack:(id)sender {
[self.navigationController popViewControllerAnimated:YES];
}
七、生命周期 – 内存警告