细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变。

因为文本框的文本改变代理不能处理,因此应该使用通知Notification。

文本框文本改变会发出通知:通知的前两个参数表示接收者object接收到通知时调用哪个类的哪个函数。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.accountField];

只要有监听必须有移除:

- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

只要修改textChange函数即可保证当用户名框或者密码框改变会调用,当两者都有内容时,才可以点击登陆按钮。

- (void)textChange
{
self.loginBtn.enabled = (self.accountField.text.length && self.pwdField.text.length);
}

细节2:记住密码和自动登录两项,如果勾选了自动登录就自动勾选记住密码,如果用户取消了记住密码,自动登录会自动取消。

并且类似这种 文字+开关 的按钮(如下图),应该用一个View来作为父控件,方便管理:

为了监听按钮的状态改变(值改变),不再是监听按钮的点击,应该监听ValueChange事件。

连线时选择Action、ValueChange事件:

Tip:开关有一个BOOL成员on用来表示开关关闭还是开启,它的get方法是isOn。

细节3:登录成功后,点击注销应当做一个提醒,一般使用底部消息框。

底部工具栏使用ActionSheet,通过称为UIActionSheet的代理来监听点击:并通过代理方法确定点击的按键。

Tip:取消按钮的索引为0.

UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
[sheet showInView:self.view];
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex != 0) return; [self.navigationController popViewControllerAnimated:YES];
}

细节4:控件拖线实现的跳转是无法拦截的,为了实现登陆跳转,不能直接将按钮拖过去。

可以通过控制器拖线过去,拖线的好处是可以传递Segue来传递信息。

Storyboard上每一根用来进行界面跳转的线,都是一个UIStoryboardSegue对象。

Segue有三个属性:

1.唯一标识:identifier

2.来源控制器:sourceViewController

3.目标控制器:destinationViewController

Segue的类型:

1.自动型:点击某个控件自动执行跳转。直接从控件拖过去的是自动型。

2.手动型:从来源控制器拖线到目标控制器。注意要设定identifier,使用来源控制器的performSegueWithIdentifier: sender:方法就可以执行Segue。

细节5:账号、密码错误时的提醒尽量不使用弹窗,因为不够友善(还需要多点击一次确定才行)。

应该设计出信息自动消失的提示,如果自己设计一个Label渐渐消失是比较麻烦的,可以通过第三方框架来实现。

第三方类库可以参考CocoaChina上的这篇文章:http://www.cocoachina.com/industry/20130106/5478.html

Tip:HUD是指示器,用来提示一些信息。

这里使用MBProgressHUD类库。可以实现漂亮的提示:

细节6:延时的实现,使用dispatch_after方法。延时的时候应该显示一个蒙板(遮盖),防止用户随意点击。

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

});

NSEC_PER_SEC前面乘的数字就是秒,block内部写延时完毕后执行的代码。

使用MBProgressHUD的方法showMessage可以产生一个蒙板,toView方法不传递参数(nil)表示显示在窗口上。

遮盖需要移除,使用hideHUD方法来移除。

(三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时的更多相关文章

  1. (三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线

    项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告. 细节1:跳转的数据传递. prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般 ...

  2. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  3. [iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

    A.需求 1.搭建一个"私人通讯录"Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改)   这个代码 ...

  4. IOS学习之-私人通讯录

    通过一段时间IOS的学习完成了一个简单的应用,"私人通讯录". 运行效果如下图: 1.登录页 2.通讯录列表 3.添加 4.编辑 5.删除 6.注销 总视图结构如下图: 总结本程序 ...

  5. NeHe OpenGL教程 第三十七课:卡通映射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. Java进阶(三十七)java 自动装箱与拆箱

    Java进阶(三十七)java 自动装箱与拆箱 前言 这个是jdk1.5以后才引入的新的内容.java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装称为装箱,解包装称为 ...

  7. Gradle 1.12用户指南翻译——第三十七章. OSGi 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. SQL注入之Sqli-labs系列第三十六关(基于宽字符逃逸GET注入)和三十七关(基于宽字节逃逸的POST注入)

    0X1 查看源码 function check_quotes($string) { $string= mysql_real_escape_string($string); return $string ...

  9. “全栈2019”Java多线程第三十七章:如何让等待的线程无法被中断

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

随机推荐

  1. Python3 MySQL 数据库连接

    什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 AP ...

  2. Linux操作系统进程模型分析进程

    Linux操作系统简介 Linux拥有现代操作系统的功能,如真正的抢先式多任务处理,支持多用户内存,保护虚拟内存,支持SMP.UP,符合POSIX 标准联网.图形用户接口和桌面环境具有快速性.稳定性等 ...

  3. activiti源码分析

    http://blog.csdn.net/vote/candidate.html?username=qq_30739519 欢迎大家投票吧谢谢

  4. postgresql跨服务器复制数据库

    假设名为dbname数据库需要从A服务器拷贝到B服务器 接收服务器B postgres用户 需先重置B服务器postgres系统用户的密码,使之与数据库用户postgres一致: passwd -d ...

  5. log file sync 因为数据线有问题而造成高等侍的表现

    这是3月份某客户的情况,原因是服务器硬件故障后进行更换之后,业务翻译偶尔出现提交缓慢的情况.我们先来看下awr的情况. 我们可以看到,该系统的load profile信息其实并不高,每秒才21个tra ...

  6. Hadoop的RPC通信原理

    RPC调用: RPC(remote procedure call)远程过程调用: 不同java进程间的对象方法的调用. 一方称作服务端(server),一方称为客户端(client): server端 ...

  7. Python 文本转语音

    文本转语音,一般会用在无障碍开发.下面介绍如何使用Python实现将文本文件转换成语音输出. 准备 使用Speech API 原理 示例代码 小总结 pyttsx方式 原理 示例代码 小总结 pytt ...

  8. 优化Javascript数据遍历

    问题 M是一个对象的集合,没个对象拥有唯一的字符串类型的Id N是Id的集合. 从M中过滤掉Id不在N中的对象. 假如M有50w个数据,N中可能是0~50w任意的数据. 方案1 使用数组保存Id的集合 ...

  9. 学习Android路上的一些感慨和总结,慢慢来,比较快!

    学习Android路上的一些感慨和总结,慢慢来,比较快! 一直想对自己的学习路程做一个总结,来告别某一个阶段的过去,迎接某一个阶段的来临,一直抽不出时间来,于是零零散散的写了点-,到现在,也已经积攒了 ...

  10. 深入浅出seesion和cookie

    session在计算机中,尤其是在网络应用中,称为"会话控制".session 对象存储特定用户会话所需的属性及配置信息.session跟踪是Web程序中常用的技术,用来跟踪用户的 ...