一、Modal
Modal方式一:代码
1.打开模态控制器
[self presentViewController:login animated:YES completion:^{NSLog(@"弹出完毕");}];
2.关闭模态控制器
[self dismissViewControllerAnimated:YES completion:nil];
Modal方式二:storyboard
在storyboard中托出两个ViewController:ViewController 和 NextViewController
按住CTRL 点击ViewController 中的button 指向 NextViewController,在弹出中选择Modal
------------、控制器之间传值----------------
传值方式一:直接复杂,缺点 耦合性太高
例子说明:在Modal,取呈现的控制器(presentingViewController)对象直接赋值
- (IBAction)loginToMain:(id)sender {
// 1.取出用户名,并传回上一个控制器
NSString *text = self.username.text;
ViewController *back =(ViewController *)self.presentingViewController;
back.userName.text=text;
//[self.delegate loginSuccess:text];
// 2.关闭当前控制器
[self dismissViewControllerAnimated:YES completion:nil];
}
传值方式二: 代理 说明:ViewController作为代理,LoginViewController中定义代理
步骤一:LoginViewController.h中定义协议
@protocol LoginViewControllerDelegate;
@interface LoginViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *username;
- (IBAction)back:(id)sender;
- (IBAction)loginToMain:(id)sender;
// 代理用weak
@property (nonatomic, weak) id<LoginViewControllerDelegate> delegate;
@end
@protocol LoginViewControllerDelegate <NSObject>
- (void)loginSuccess:(NSString *)usernameText;
@end
步骤二:ViewController.h继承协议
@protocol LoginViewControllerDelegate;
@interface ViewController : UIViewController<LoginViewControllerDelegate>
@end
步骤三:ViewController.m chu 绑定代理,并实现接受消息方法loginSucess
// 初始化控制器
LoginViewController *login = [[LoginViewController alloc] init];
login.delegate = self;
// 弹出登录界面
[self presentViewController:login animated:YES completion:^{
NSLog(@"弹出完毕");
}];
#pragma mark LoginViewControllerDelegate方法
- (void)loginSuccess:(NSString *)usernameText
{
// NSLog(@"%@",usernameText);
self.userName.text=usernameText;
}
步骤四:LoginViewController.m 触发代理方法
[self.delegateloginSuccess:text];
二、push 用到导航控制器UINavigationController 类似 栈
方式一 代码:
MJAppDelegate.m中 创建导航控制器,并设置MJViewController为第一个控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[MJViewController alloc] initWithNibName:@"MJViewController" bundle:nil];
// 创建导航控制器(并且设置MJViewController是第一个子控制器)
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:self.viewController];
//NSLog(@"nav=%@", nav);
self.window.rootViewController = nav;
[self.window makeKeyAndVisible];
return YES;
}
导航控制器掌握:
1.创建导航控制器
[[UINavigationController alloc] initWithRootViewController:self.viewController];
2.栈(栈中所有的子控制器)
self.navigationController.viewControllers;
3.将控制器压入栈中
[self.navigationController pushViewController:second animated:YES];
4.将控制器从栈中弹出
1> 将栈顶控制器弹出
[self.navigationController popViewControllerAnimated:YES];
2> 回到栈底控制器(根控制器)
[self.navigationController popToRootViewControllerAnimated:YES];
3> 回到具体某一个控制器
[self.navigationController popToViewController:<#(UIViewController *)#> animated:<#(BOOL)#>];
5.导航栏显示的内容
1> 栈顶控制器的navigationItem属性决定了导航栏上面显示的东西
2> 导航栏左边的返回键,是由上一个控制器决定
6.栈顶控制器
self.navigationController.topViewController
// 栈顶控制器的navigationItem属性决定了导航栏上面显示的东西
// 导航栏左边的返回键,是由上一个控制器决定
self.navigationItem.title = @"MJViewController";
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil];
// 设置下一个界面的返回按钮
self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
方式二 :storyboard
// 跳到下一个控制器 (执行对应的线):VIew 对 View拖,push的线;“ogin_success”对于线的identifier
[selfperformSegueWithIdentifier:@"login_success"sender:nil];
在执行segue之前会调用一个方法
#pragma mark 执行segue之前会先调用一下这个方法
// 可以给下一个控制器传递数据
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
//segue.sourceViewController; // 来源控制器
//segue.destinationViewController; // 目的控制器
NSLog(@"%@", segue.sourceViewController);
NSLog(@"%@", segue.destinationViewController);
}
二、UITabBarController
1.UITabbarController的所有子控制器:viewControllers
2.UITabbarController可以设置delegate,监听切换过程
3.每个标签显示的内容由当前子控制器的tabbarItem属性决定
self.tabBarItem.title = @"MJView"; // 文字
self.tabBarItem.badgeValue = @"5"; // 红色数字
self.tabBarItem.image // 图片