细节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. COCO 数据集的使用

    Windows 10 编译 Pycocotools 踩坑记 COCO数据库简介 微软发布的COCO数据库, 除了图片以外还提供物体检测, 分割(segmentation)和对图像的语义文本描述信息. ...

  2. 关于spring的IOC和DI的xml以及注解的简单介绍

    xml 一 目的:通过ApplicationContext对象的getBean方法获取所需类的对象. 编写一个service类 public class service { private Strin ...

  3. KVM 时钟分析

    1. 关于GToffset: KVM的guset时钟为gc0_COUNT 其中:mfc0 gc0_count = c0_COUNT+GToffset vcpu_run 以及 vcpu_reenter的 ...

  4. Linux下MySQL 数据库的基本操作

    1. 创建数据库相关命令: 首先,下载MySQL相关软件包:aptitude install mysql-server/mysql-client MySQL中的root用户类似于Linux下的root ...

  5. 最优秀的网络框架retrofit

    由于某学员要求所以我打算写一篇 标题先记录下来 我会在一周内完成此篇文章

  6. 安卓7.1 新特性Shortcut

    介绍 Shortcut 是谷歌在API25提出来的 类似苹果3D touch 但是没有压力感应.在安卓中完全就是长按. 来看下效果吧: 是不是很赞? 那么请随本文一起学习吧 更新 新建项目 在你项目下 ...

  7. 字符编码(ASCII、ANSI、GB2312、UTF-8等)系统梳理

    引言 在显示器上看见的文字.图片等信息在电脑里面其实并不是我们看见的样子,即使你知道所有信息都存储在硬盘里,把它拆开也看不见里面有任何东西,只有些盘片.假设,你用显微镜把盘片放大,会看见盘片表面凹凸不 ...

  8. Java进阶(四十一)多线程讲解

    Java多线程讲解 前言 接到菜鸟网络的电话面试,面试官让自己谈一下自己对多线程的理解,现将其内容整理如下. 线程生命周期 Java线程具有五种基本状态 新建状态(New):当线程对象创建后,即进入了 ...

  9. Dynamics CRM 将实体从高级查找列表中移除不可见

    有时我们不需要将某个实体显示给一般用户比如配置实体,但是这种类型的实体有时候又需要给一般用户读权限ODATA的时候得能读,站点地图上的隐藏比较容易用工具配置下权限即可.其实做到这步一般就可以了但有的客 ...

  10. mysql数据库连接池使用(二)实现自己的数据库连接池

    上一个章节,我们讲了xml文件的解析框架XMLConfiguration的使用,不懂的可以参考 Apache Commons Configuration读取xml配置具体使用. 这个章节主要实现自己的 ...