视图控制器-navigationcontroller
navigationcontroller里组织的视图是由层次关系。
内部有个rootviewcontroller,根视图控制器。以栈的方式组织视图控制器,对于进栈的控制器是先进后出。后进先出。
导航控制器始终显示的是栈顶的视图控制器。
在navigateitem里可以设置标题,返回按钮的标题,以及提示,提示用的少。主要是标题,返回按钮的标题是,在下级视图里,返回来的时候返回按钮显示的标题。
常用的属性有tintcolor.
对于model方式,是通过视图控制器自己调用present dismiss等方法来创建和销毁的。
对于push方式,是通过push,pop方法来显示视图控制器和释放控制器的。
视图控制器之间传递消息
1) 父视图向子视图传递消息,直接调用子视图的方法或者给子视图的成员变量赋值
2)子视图给父视图传递消息,可以在子视图定义代理或者block,父视图实现代理,或者实例化子视图的时候,传给子视图block定义。
子视图触发代理或者block就把消息传到父视图。
在storyboard里可以用segue连线方式也可以用代码push方式做视图跳转。
在xib里只能使用push代码方式跳转。
navigatebar和toolbar的区别
都可以设置标题。
navigatebar只能放左右两边按钮
toolbar可以放置多个按钮。
在导航控制器的子视图控制器里,是用自己内部的导航控制器来push出下一个视图。在返回的时候也是用自己内部的导航控制器pop出去到上一级视图或者其他视图,或者根视图。
一般在导航控制器里,左边的按钮不用设置,只设置右边的按钮。左边默认是返回按钮。
用storyboard方式创建的连线,叫segue,可以在2个控制器之间建立segue,在控制器里按钮执行代码里,调用performsegue方法,执行跳转。
如果没有添加导航控制器,在一个视图里用segue方式push一个视图的时候会报错。但model方式是不会报错的。
使用方式一:storyboard内嵌方式
1)创建一个带storyboard的singleview程序
2)选择当前视图控制器
3)在Editor菜单里选择添加嵌入导航控制器
这样就添加进来导航控制器
4)运行程序,会看到导航栏
第二种方式:拖导航栏控件到storyboard上
1) 创建带storyboard的单视图程序。
2)打开storyboard,拖导航控制器到storyboard
3) 把代表启动开始的箭头,拖到导航控制器开始上
4)删除导航控制器自带的视图控制器
5)然后在导航控制器上点击右键,连接rootviewcontroller到刚添加的视图控制器上。把当前这个视图控制器设置为
导航控制器的根视图控制器
6)运行应用程序,在跟视图控制器上就看到导航栏。
使用方式三:代码方式创建
1)创建空项目
2)添加一个带xib的视图控制器,并设置代理的window的主视图控制器是当前这个视图控制器
3)修改xib里视图的大小
4)拖按钮到xib视图上,这时候程序已经可以运行。
5)修改代理方法,实例化导航控制器类,然后设置window的根视图控制器是导航控制器
6)设置之前的视图控制器作为导航控制器的根视图控制器,代码如下
#import "AppDelegate.h"
#import "MainViewController.h"
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
MainViewController *controller = [[MainViewController alloc] init];
UINavigationController *navicontroller = [[UINavigationController alloc] initWithRootViewController:controller];
[self.window setRootViewController:navicontroller];
[self.window makeKeyAndVisible];
return YES;
}
7)运行程序,就看到视图控制器上显示了导航栏
跳转代码
- (IBAction)click:(id)sender {
SecondViewController *controller = [[SecondViewController alloc] init];
[self.navigationController pushViewController:controller animated:YES];
}
设置当前视图控制器标题和在下一级视图控制器里显示的返回按钮的标题
// Do any additional setup after loading the view from its nib.
[self.navigationItem setTitle:@"第一个视图"];
// 这样设置是设置不上的,因为现在这个按钮还没有被实例化
[self.navigationItem.backBarButtonItem setTitle:@"返回"];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
设置左右两边按钮代码
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.navigationItem setTitle:@"第一个视图"];
// 这样设置是设置不上的,因为现在这个按钮还没有被实例化
[self.navigationItem.backBarButtonItem setTitle:@"返回"];
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"设置" style:UIBarButtonItemStyleDone target:nil action:nil];
self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"查看" style:UIBarButtonItemStyleDone target:nil action:nil];
}