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];设置右边的Buttonitemself.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执行前执行"); }
原文:http://blog.csdn.net/cooljune/article/details/19767267