最后效果图:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcHJlX2VtaW5lbnQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

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界面上的登录button,切换到BeyondLoginViewController.h进行输入password帐号登录
- (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管理的栈实现
从右往左边展开,弹出新的控制器(处于栈顶),
涉及内容主要有:
參数的传递
导航栏的标题定制
跳转前的验证,典型如登录跳转前的client校验 3,UITabbarController
以平行的方式是管理子视图控制器 4,自己定义容器,相似抽屉效果(右滑,弹出左側边栏) */ #import "BeyondViewController.h"
#import "BeyondLoginViewController.h"
@interface BeyondViewController ()<BeyondLoginViewControllerDelegate,UIActionSheetDelegate> @end @implementation BeyondViewController - (void)viewDidLoad
{
[super viewDidLoad]; } // 点击BeyondViewController界面上的登录按钮,切换到BeyondLoginViewController.h进行输入password帐号登录
- (IBAction)wantLogin:(UIButton *)sender {
// 想通过代码以Modal的方式,切换到BeyondLoginViewController控制器,就必须创建实例对象,耦合性太强~
BeyondLoginViewController *loginViewCtrl = [[BeyondLoginViewController alloc]init];
// 设置loginViewCtrl的代理 为当前控制器,由于,在下一个控制器(loginViewCtrl)中,用户输入完用户名和password之后,会调用代理 的doSomethingWithUsername方法,给它的代理对象(即当前控制器)发消息,參数 就是要传递过来的用户名~
loginViewCtrl.delegate = self;
// 关键,代码,全部控制器都有该方法,展现
[self presentViewController:loginViewCtrl animated:YES completion:^{
NSLog(@"BeyondLogin控制器--出现了");
}];
} // 实现下一个控制器中代理方法,由于在下一个控制器(loginViewCtrl)中,用户输入完用户名和password之后,会调用代理 的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; // 向server提交username与password
- (IBAction)submit:(UIButton *)sender; // 点击返回button,返回到前一个控制器
- (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框 为星号
_password.secureTextEntry = YES;
} // 点击返回button,返回到前一个控制器
- (IBAction)backToHome:(UIBarButtonItem *)sender
{
// 关键代码,关闭自身这个modal模态对话框
[self dismissViewControllerAnimated:YES completion:^{
NSLog(@"BeyondLogin控制器,消失了");
}];
} // 向server提交用户名和password
- (IBAction)submit:(UIButton *)sender {
// 如同 JS 表单验证
if (_username.text.length == 0 || _password.text.length == 0) {
// <#(id<UIActionSheetDelegate>)#>
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:@"请输入用户名和password" delegate:nil cancelButtonTitle:@"取消" destructiveButtonTitle:@"红色警告" otherButtonTitles:@"其它button", 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

Modal模态对话框--------通过storyboard方式实现

版权声明:本文博客原创文章,博客,未经同意,不得转载。

iOS_16_开关控制器_modal_代码方法的更多相关文章

  1. Thinkphp--------为什么Thinkphp会默认进入Index控制器的index方法

    最近遇到两个刚学PHP的童鞋,都问到了同一个问题,就是他们没有做什么配置,为什么访问入口文件index.php的时候会自动跳转到IndexController里面的index方法.他们想知道具体怎么回 ...

  2. .NET CORE控制器里的方法取传参的坑

    把以前的ASP.NET MVC的项目改成用.NET CORE来写,写好了部署上去了,结果问题一大堆,今天慢慢检查了一下,发现一个大坑: 写控制器里的方法接收参数数都是直接写在控制器的方法参数里的,如: ...

  3. legend2---开发日志10(ajax请求的方法是否同样会执行base控制器里面的方法)

    legend2---开发日志10(ajax请求的方法是否同样会执行base控制器里面的方法) 一.总结 一句话总结:会执行的,所以写base控制器里面的方法要注意,base控制器里面的方法要以查数据为 ...

  4. spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClassNameHandlerMapping

    spring mvc: 参数方法名称解析器(用参数来解析控制器下的方法)MultiActionController/ParameterMethodNameResolver/ControllerClas ...

  5. TP框架控制器和对应方法创建

    控制器和对应方法创建 控制器是MVC模式中的核心,TP默认有一个控制器:   Index控制器里面有一个操作方法:Index   我们在访问http://localhost:8080/Thinkphp ...

  6. [Xcode 实际操作]九、实用进阶-(3)给代码方法添加宏注释

    目录:[Swift]Xcode实际操作 本文将演示如何在方法列表中,对方法名称进行注释. 这样可以使程序,按功能分块,使方法清晰.易读并且方便定位. 在项目导航区,打开视图控制器的代码文件[ViewC ...

  7. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  8. legend3---17、如何抽象和复用控制器中的方法

    legend3---17.如何抽象和复用控制器中的方法 一.总结 一句话总结: 比如不同的控制器中都用了检查手机号是否已经注册,是否没注册这样的功能,我应该如何抽象和复用方法 新建一个处理手机号码的模 ...

  9. ThinkPHP开发api时多级控制器的访问方法

    发开api时,经常会用到thinkphp的多级控制器,访问方法如下: 例如:有v1和v2两个版本的接口 v1:版本控制器(类文件位置为:application/api/controller/v1/Us ...

随机推荐

  1. 机房收费系统总结之4——VB.NET 轻松解决判断文本框、组合框为空问题

    纵观机房收费系统,判断文本框.组合框为空问题无非两种情况.第一种:判断窗体中所有文本框.组合框是否为空.第二种:判断一部分文本框.组合框是否为空.下面看看是如何实现这两种情况的. 第一种:判断窗体中所 ...

  2. 碰撞回避算法(一) Velocity Obstacle

    碰撞回避是机器人导航,游戏AI等领域的基础课题.几十年来,有很多算法被提出.注意这里主要指的是局部的碰撞回避算法.尽管和全局的路径规划算法(A*算法等)有千丝万缕的联系.可是还是有所不同的(局部的碰撞 ...

  3. 解决Java compiler level does not match the version of the installed Java project facet.问题

    其实之前遇到过Java compiler level does not match the version of the installed Java project facet.这个问题,因为当时没 ...

  4. Servlet的学习之Response响应对象(1)

    在之前学习了Servlet中的主体结构,包括Servlet的生命周期方法,和非生命周期方法能获取的一些非常重要的对象如ServletConfig.ServletContext对象等,而从这篇开始我们将 ...

  5. 大数据实时处理-基于Spark的大数据实时处理及应用技术培训

    随着互联网.移动互联网和物联网的发展,我们已经切实地迎来了一个大数据 的时代.大数据是指无法在一定时间内用常规软件工具对其内容进行抓取.管理和处理的数据集合,对大数据的分析已经成为一个非常重要且紧迫的 ...

  6. vs2008中使用gdi+的设置

    vs2008中使用gdi+ 1.新建一个mfc工程 2.在stdafx.h文件中加入以下几行语句: #include <gdiplus.h>                //#pragm ...

  7. 我们熟悉的Textbox

    创建只读文本框 方法一: 可用Readonly属性防止用户编辑文本框内容.将Readonly属性设置为True后,用户就可以滚动文本框中的文本并将其突出显示,但不能作任何更改.将Readonly属性设 ...

  8. Windows DIB文件操作具体解释-5.DIB和调色板

    Windows调色板是256色显卡时期的产物,如今显卡最少也是16bit的了.所以调色板基本上是用不到了的. 可是以下几种情况还是须要去使用和了解调色板: 1.在新显卡上保证256色兼容模式的正常执行 ...

  9. 每次调用fork()函数之后,父线程和创建出的子线程都是从fork()后开始执行

    Linux下多少个"-"将被打印: 1 2 3 4 5 6 7 8 int main(void){   int i;   for(i=0;i<4;i++){   fork() ...

  10. MySQL学习笔记之中的一个 MySQL入门

    本人之前接触的关系型数据库主要是oracle和sqlserver,而对于mysql知之甚少,但查阅网上资料发现,mysql与oracle非常相似,所以学起来应该不会非常费劲,在总结的时候可能很多其它的 ...