细节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. Node.js Query Strings

    Query String 稳定性: 3 - 稳定 这个模块提供了一些处理 query strings 的工具,包括以下方法: querystring.stringify(obj[, sep][, eq ...

  2. PHP 实例 AJAX 与 XML

    在 PHP 中,AJAX 可用来与 XML 文件进行交互式通信,具体的通信过程,请参考本文内容! AJAX XML 实例 下面的实例将演示网页如何通过 AJAX 从 XML 文件读取信息: 实例   ...

  3. WebRTC 音频算法 附完整C代码

    WebRTC提供一套音频处理引擎, 包含以下算法: AGC自动增益控制(Automatic Gain Control) ANS噪音抑制(Automatic Noise Suppression) AEC ...

  4. springMVC源码--Controller控制器

    springMVC给我们提供Controller控制器,用来实现我们的逻辑处理,在Controller接口中定义的方法也是比较简单的,如下: Controller接口及实现类:

  5. Dynamics CRM 不同的站点地图下设置默认不同的仪表板

    CRM的默认仪表板只能设置一个,也就是说每个引用仪表板的站点地图下点开仪表板后都是看到的默认仪表板,例如我下图中的"日常维修仪表板" 那如果我要在不同的站点地图下看到的默认仪表板不 ...

  6. Android 6.0出现的init: cannot execve(‘XXX’):Permission denied问题:禁止SELINUX的权限设置

    最近在开发MTK的相关项目,需要将一些可执行文件添加到init.rc文件里去,但是开机后发现,这个bin文件没有权限不能执行,于是我就在init.rc中对相应的bin文件增加了权限.后来发现,改了也没 ...

  7. 在做自动化测试之前你需要知道的,转自:http://www.cnblogs.com/fnng/p/3653793.html

    什么是自动化测? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多.一直想动笔写一篇文章分享自动化测试实践中的一些经验.终于决定花点时间来做这件事儿. 首先理清自动化测试的概念 ...

  8. Kafka学习笔记1:概念

    一.简介 Apache Kafka是一个分布式的消息系统,作为一个分布式的日志提交服务. Kafka 是一个分布式的.可分区的.可复制的日志提交服务. 它提供了功能性的消息系统,有它自己独特的设计. ...

  9. Linux 环境下一些常用的命令(二)

    11. chown命令 "chown"命令就是改变文件拥有者和所在用户组.每个文件都属于一个用户组和一个用户.在你的目录下,使用"ls -l",你就会看到像这样 ...

  10. mysql 远程连接配置

    近期买了阿里云服务器,服务器 安装了mysql,需要远程操作mysql数据库,但是远程不配置的话,连接不上去的.需要配置 .具体的配置如下: 先看看my.cnf是否绑定了本机,如果绑定了地址就解绑吧. ...