首页 > 其他 > 详细

ios多控制器切换

时间:2014-02-24 21:41:04      阅读:488      评论:0      收藏:0      [点我收藏+]

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执行前执行");
}



ios多控制器切换

原文:http://blog.csdn.net/cooljune/article/details/19767267

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!