ios多控制器切换

本文介绍了iOS中两种主要的控制器切换方式:模态(Modal)和推送(Push)。Modal切换通过隐藏/显示控制器实现,常使用Storyboard以降低耦合度。Push则涉及UINavigationController,控制器按栈结构管理,返回键内容由栈顶控制器决定。同时提到了Storyboard中通过Segue进行Push操作的方法。

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生效,连线的时候是控制器连向控制器,而不是通过控制器元素连向另外一个控制器,因为之间还需要数据校验和交互,通过设置segueidentifier来标记。

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值