iOS_16_控制器切换_modal_代码方式

最终效果图:



main.storyboard



BeyondViewController.h

//
//  BeyondViewController.h
//  16_控制器切换方式1_Modal_通过代码方式
//
//  Created by beyond on 14-7-30.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface BeyondViewController : UIViewController
// 提示欢迎谁谁谁
@property (weak, nonatomic) IBOutlet UILabel *welcomeLabel;
@property (weak, nonatomic) IBOutlet UIButton *wantLoginBtn;
@property (weak, nonatomic) IBOutlet UIButton *wantLogoutBtn;

// 点击BeyondViewController界面上的登录按钮,切换到BeyondLoginViewController.h进行输入密码帐号登录
- (IBAction)wantLogin:(UIButton *)sender;
- (IBAction)wantLogout:(UIButton *)sender;

@end


BeyondViewController.m

//
//  BeyondViewController.m
//  16_控制器切换方式1_Modal_通过代码方式
//
//  Created by beyond on 14-7-30.
//  Copyright (c) 2014年 com.beyond. All rights reserved.

/*
 控制器切换的3种方式:
 1,modal (模态对话框,新的控制器从底部往上展开,遮住后面的控制器)(更多可以参看 罗云彬的<琢石成器—Windows环境下32位汇编语言程序设计>第5.4章 对话框)
    通过代码实现切换
    通过storyboard实现切换
 
 2,push 通过UINavigationController管理的栈实现
    从右往左边展开,弹出新的控制器(处于栈顶),
    涉及内容主要有:
                参数的传递
                导航栏的标题定制
                跳转前的验证,典型如登录跳转前的客户端校验
 
 3,UITabbarController
    以平行的方式是管理子视图控制器

 
 4,自定义容器,类似抽屉效果(右滑,弹出左侧边栏)
 
 */

#import "BeyondViewController.h"
#import "BeyondLoginViewController.h"
@interface BeyondViewController ()<BeyondLoginViewControllerDelegate,UIActionSheetDelegate>

@end

@implementation BeyondViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
	
}

// 点击BeyondViewController界面上的登录按钮,切换到BeyondLoginViewController.h进行输入密码帐号登录
- (IBAction)wantLogin:(UIButton *)sender {
    // 想通过代码以Modal的方式,切换到BeyondLoginViewController控制器,就必须创建实例对象,耦合性太强~
    BeyondLoginViewController *loginViewCtrl = [[BeyondLoginViewController alloc]init];
    // 设置loginViewCtrl的代理 为当前控制器,因为,在下一个控制器(loginViewCtrl)中,用户输入完用户名和密码之后,会调用代理 的doSomethingWithUsername方法,给它的代理对象(即当前控制器)发消息,参数 就是要传递过来的用户名~
    loginViewCtrl.delegate = self;
    // 关键,代码,所有控制器都有该方法,展现
    [self presentViewController:loginViewCtrl animated:YES completion:^{
        NSLog(@"BeyondLogin控制器--出现了");
    }];
}




// 实现下一个控制器中代理方法,因为在下一个控制器(loginViewCtrl)中,用户输入完用户名和密码之后,会调用代理 的doSomethingWithUsername方法,给它的代理对象(即当前控制器)发消息,参数 就是要传递过来的用户名~
- (void)doSomethingWithLoginName:(NSString *)username
{
    username = [NSString stringWithFormat:@"欢迎回来:%@",username];
    _welcomeLabel.text = username;
    
    // 禁用登录按钮
    _wantLoginBtn.enabled = NO;
    _wantLogoutBtn.enabled = YES;
}


- (IBAction)wantLogout:(UIButton *)sender
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"确定注销吗?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
    [actionSheet showInView:self.view];
}

#pragma mark - actionSheet的代理 方法
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"按钮索引:%d",buttonIndex);
    // 确定注销   索引是 0
    if (buttonIndex == 0) {
        // 注销
        _wantLoginBtn.enabled = YES;
        _wantLogoutBtn.enabled = NO;
        _welcomeLabel.text = @"";
    }
    // 取消   索引是 1  doNothing
    
}
@end

协议 

BeyondLoginViewControllerDelegate.h

//
//  BeyondLoginViewControllerDelegate.h
//  16_控制器切换方式1_Modal
//
//  Created by beyond on 14-7-30.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <Foundation/Foundation.h>

@protocol BeyondLoginViewControllerDelegate <NSObject>

- (void) doSomethingWithLoginName:(NSString *)username;
@end


BeyondLoginViewController.xib


BeyondLoginViewController.h

//
//  BeyondLoginViewController.h
//  16_控制器切换方式1_Modal
//
//  Created by beyond on 14-7-30.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import <UIKit/UIKit.h>
#import "BeyondLoginViewControllerDelegate.h"

@interface BeyondLoginViewController : UIViewController

// id类型的代理 (weak弱引用),调用代理 的方法,将本控制器中用户输入的姓名,通过参数传递给 代理 ,供其使用
@property (nonatomic,weak) id <BeyondLoginViewControllerDelegate> delegate;

@property (weak, nonatomic) IBOutlet UITextField *username;
@property (weak, nonatomic) IBOutlet UITextField *password;

// 向服务器提交用户名和密码
- (IBAction)submit:(UIButton *)sender;

// 点击返回按钮,返回到前一个控制器
- (IBAction)backToHome:(UIBarButtonItem *)sender;

@end


BeyondLoginViewController.m

//
//  BeyondLoginViewController.m
//  16_控制器切换方式1_Modal
//
//  Created by beyond on 14-7-30.
//  Copyright (c) 2014年 com.beyond. All rights reserved.
//

#import "BeyondLoginViewController.h"
#import "BeyondViewController.h"
#import "BeyondLoginViewControllerDelegate.h"
@interface BeyondLoginViewController ()

@end

@implementation BeyondLoginViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // 设置密码框 为星号
    _password.secureTextEntry = YES;
}


// 点击返回按钮,返回到前一个控制器
- (IBAction)backToHome:(UIBarButtonItem *)sender
{
    // 关键代码,关闭自身这个modal模态对话框
    [self dismissViewControllerAnimated:YES completion:^{
        NSLog(@"BeyondLogin控制器,消失了");
    }];
}

// 向服务器提交用户名和密码
- (IBAction)submit:(UIButton *)sender {
    // 如同 JS 表单验证
    if (_username.text.length == 0 || _password.text.length == 0) {
        // <#(id<UIActionSheetDelegate>)#>
        UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"请输入用户名和密码" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"红色警告" otherButtonTitles:@"其他按钮", nil];
        // 如同toast,手动显示
        [actionSheet showInView:self.view];
        
        // 直接返回
        return;
    }
    
    // 传递数据 给上一个控制器
    /*
    // 方式1,耦合性太强,直接得到弹出自己的那一个(上一个)控制器
    BeyondViewController *preVC = (BeyondViewController *)self.presentingViewController;
            // 这样就可以设置上一个控制 器的Label了
    preVC.welcomeLabel.text = _username.text;
    [self dismissViewControllerAnimated:YES completion:nil];
    */
    
    // 方式2,使用代理 ,调用代理 的方法,并将当前控制器的输入的用户名,作为参数,传递给代理的这个方法里,供代理去使用
    [self.delegate doSomethingWithLoginName:_username.text];
    [self dismissViewControllerAnimated:YES completion:nil];
}
@end






iOS_16_控制器切换_modal_代码方式,,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。