iOS中控制器切换分为:modal(模态窗口遮挡)、push(uinavigationcontroller)、uitabbarcontroller和自定义控制器切换。
modal代码方式,耦合度较高,控制器相互依赖,所以使用modal的时候用storyboard。
一.通过代码方式
@protocol LoginControllerViewControllerDelegate;
@interface LoginControllerViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITextField *userName;
//代理
@property(weak,nonatomic)id<LoginControllerViewControllerDelegate> delegate;
- (IBAction)login;
- (IBAction)back:(id)sender;
@end
//协议
@protocol LoginControllerViewControllerDelegate <NSObject>
-(void)loginSuccess:(NSString *)userName;
@end
实现
- (IBAction)login {
//cooljuneViewController *view=(cooljuneViewController *)self.presentingViewController;
//view.userName.text=self.userName.text;
//通过代理传入参数
[self.delegate loginSuccess:self.userName.text];
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"自动隐藏");
}];
}
- (IBAction)back:(id)sender {
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"自动隐藏");
}];
}
让根控制器实现协议
@protocol LoginControllerViewControllerDelegate;
@interface cooljuneViewController: UIViewController <LoginControllerViewControllerDelegate>
@property (weak, nonatomic) IBOutlet UILabel *userName;
- (IBAction)login;
@end
实现协议中的方法
- (IBAction)login {
LoginControllerViewController *login=[[LoginControllerViewController alloc]init];
//设置代理为当前控制器
login.delegate=self;
[self presentViewController:login animated:YES completion:^{
NSLog(@"点击了登录");
}];
}
-(void)loginSuccess:(NSString *)userName{
NSLog(@"sdf");
self.userName.text=userName;
}
modal的方式主要是通过隐藏或者显示当前控制器让其他控制器出现切换
- (IBAction)back {
[self dismissViewControllerAnimated:YES completion:nil];
}
push的方式主要是把所有控制器放在一个管理控制器的容器中UINavigationController(导航控制器),而在导航控制器中所有的子控制器都是放在一个栈(先进后出)中,而在界面上显示的永远的栈顶的控制器。
一.push代码方式
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"gg");
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
//self.window.rootViewController=[[cooljuneViewController alloc]init];
//设置栈底控制器
UINavigationController *nav=[[UINavigationController alloc]initWithRootViewController:[[cooljuneViewController alloc]init]];
self.window.rootViewController=nav;
[self.window makeKeyAndVisible];
return YES;
}
而back返回键的内容显示是由栈顶控制器决定的
//栈顶控制器决定了navigationItem上面显示的内容
self.title=@"哈哈"; //等价self.navigationItem.title=@"设置";
self.navigationItem.backBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:nil action:nil];
设置右边的Buttonitem
self.navigationItem.rightBarButtonItem=[[UIBarButtonItem alloc]initWithTitle:@"下一页" style:UIBarButtonItemStyleBordered target:self action:@selector(nextpage)];
切换到指定的控制器
-(void)nextpage{
[self.navigationController pushViewController:[[OtherViewController alloc]init] animated:YES];
}
常见方法
self.navigationController.viewControllers//获取所有控制器
//切换到根控制器
[self.navigationController popToRootViewControllerAnimated:YES];
//跳到指定控制器
[self.navigationController popToViewController:<#(UIViewController *)#> animated:<#(BOOL)#>];
//跳出当前控制器
[self.navigationController popViewControllerAnimated:YES];
二.storyboard方式
storyboard连线的方式主要是通过segue来控制什么时候push生效,连线的时候是控制器连向控制器,而不是通过控制器元素连向另外一个控制器,因为之间还需要数据校验和交互,通过设置segue的identifier来标记。
- (IBAction)login {
NSString *qqNo=self.qqNo.text;
if (qqNo.length==0) {
//[UIAlertView alloc]
UIAlertView *alert=[[UIAlertView alloc]init];
[alert show];
UIActionSheet *sheet= [[UIActionSheet alloc]initWithTitle:@"tishi" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:@"其他按钮", nil];
[sheet showInView:self.view];
}else{
//[self.navigationController de];
[self performSegueWithIdentifier:@"login_success" sender:nil];
}
}
//在segue生效之前调用
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
segue.sourceViewController; //来源控制器
segue.destinationViewController;//目的控制器
NSLog(@"segue执行前执行");
}