"【导航控制器】"
导航控制器是用来管多个子控制器,实现不同界面间的"来回切换"
导航控制器显示各个子控制器显示的的原理
栈顶原理
0.导航控制器将所要显示的子控制器放到一个栈中
1.导航控制器显示的第一个控制器为栈顶控制器(此时栈里面就一个控制器)
2.返回上一个子控制器时,栈顶控制器的view从导航控制器的view中移除,并且栈顶控制器将被销毁
3.把最新的栈顶控制器的view显示在导航控制器view的上面
4.所有的子控制器会存储在导航控制器的viewControllers属性中
@property(nonatomic,copy)NSArray *viewControllers;
@property(nonatomic,readonly)NSArray *childViewControllers;
- (void)pushViewController:(UIViewController*)viewController animated:(BOOL)animated;
- (UIViewController*)popViewControllerAnimated:(BOOL)animated;
回到指定的子控制器
- (NSArray*)popToViewController:(UIViewController*)viewController animated:(BOOL)animated;
导航控制器的结构:
@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;
代码创建导航控制器:
</pre><pre name="code" class="objc">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建窗口,成为主窗口并可见
UIWindow *window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
window.backgroundColor = [UIColor redColor];
CZOneViewController *oneVc = [[CZOneViewController alloc] init];
//1.创建导航控制器
UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:oneVc];
//可以通过下面的方法来添加导航控制器第一个显示的控制器
//UINavigationController *navContr = [[UINavigationController alloc] init];
//[navContr addChildViewController:oneVc];
[navContr pushViewController:oneVc animated:NO];
//设置窗口的根控制器为导航控制器
window.rootViewController = navContr;
[window makeKeyAndVisible];
self.window = window;
return YES;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
通过storyboard方式创建导航控制器
效果图:
1、Main.storyboard里面默认有一个viewController,删掉,拖一个UINavigationController
拖进来的导航控制器里面默认的跟控制器是一个TableViewController,在这里我们只要一个viewController就行了,于是删掉,拖一个viewController取名字为“第一个控制器”
2、按住ctrl键脱线,设置第一个控制器为导航控制器的根控制器,或者右键点击选中rootViewController脱线
双击第一个控制器的导航条的中间位置设置导航条的标题为“第一个控制器”
或者选中导航条设置导航条的title属性
3、同上创建第二个控制器,从第一个控制器向第二个控制器脱线进行跳转(从第一个控制器上面的按钮脱线)
这种方法创建的导航控制器就跟控制器系统给提供导航栏,这就需要我们在第二个以及以后创建的控制器上拖一个导航栏
注意:如果想从第n个控制器返回到第 n - 1 个控制器就不能在脱线了,必须通过代码实现
自定义导航栏的title:
方法一、设置导航栏的titleView属性
方法二、向导航栏的标题位置拖一个UIView
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
什么是Segue
@property (nonatomic,readonly) NSString *identifier;
@property (nonatomic,readonly) id sourceViewController;
@property (nonatomic,readonly) id destinationViewController;
(手动跳转必须点控制器上面的黄色控制器按钮脱线)
[self performSegueWithIdentifier:@"login2contacts" sender:nil]; // login2contacts就是对应Segue的唯一标识
// Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用
[self performSegueWithIdentifier:@“login2contacts”sender:nil];
// 这个self是来源控制器
- (void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender;
// 这个sender是当初performSegueWithIdentifier:sender:中传入的sender