(三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线
项目中的警告是不会影响app发布的,例如引入第三方类库很容易引入警告。
细节1:跳转的数据传递。
prepareForSegue: sender: 方法是在执行segue后,跳转之前调用这个方法,一般在这里给下一个控制器传递数据。
可以直接在这里获取目标控制器:如果只是简单的修改,不必一定写成真实的控制器类型
UIViewController *contactVc = segue.destinationViewController;
这样就可以修改目标视图的内容了。
Tip:控制器的title属性等价于Navigation的title属性。
Tip:segue的perform方法被执行时会跳转。
Tip:performSegueWithIdentifier: sender: 方法的sender参数会传递到perpareForSegue函数内。
细节2:输入信息的页码,键盘自动弹出。
应该在viewDidAppear方法中,让第一个输入框成为第一响应者:叫出键盘。
Tip:不要忘记调用super的这个方法!
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated]; // 让姓名文本框成为第一响应者(叫出键盘)
[self.nameField becomeFirstResponder];
}
细节3:反向传递数据(从目标控制器传递到源控制器)。
联系人添加完毕后要将数据添加回联系人列表,返回是pop操作,不存在Segue。
联系人添加视图要在完成时调用联系人列表的代理方法,因此应该为联系人添加视图设置代理(delegate用weak),让联系人列表成为代理。
Tip:delegate用weak。
注意在添加之前将目标控制器(联系人添加视图)的delegate为联系人列表,以保证联系人列表可以监听到联系人添加的代理方法。
只需要在联系人列表中实现这个方法即可。
Tip:联系人列表是可变的,应该使用NSMutableArray,注意框架中的类型用strong。
@property (nonatomic, strong) NSMutableArray *contacts;
对于数组的初始化,应该是重写get方法进行懒加载。
- (NSMutableArray *)contacts
{
if (_contacts == nil) {
_contacts = [NSMutableArray array];
}
return _contacts;
}
Tip:代理的标准写法是第一个参数为调用代理方法的对象。
Tip:代理的一个作用是解耦(解除耦合性)。
关于@property的复习:
copy用于NSString和NSMutaleString、block
weak用于代理(delegate对象)和UI控件
strong用于其他OC对象
assign用于基本数据类型,注意枚举和结构体也属于基本数据类型。
关于模型的补充:
如果不是用字典来初始化数据,可以不用KVC,因为创建字典也是个繁琐的过程。
细节4:点击TableViewCell实现跳转到编辑:
拖动cell到要跳转到的视图,选择Selection Segue的push(如果有NavigationController),是自动Segue。
Tip:如果自定义cell已经有了标识,不需要再判断从缓存池中取出的是否为空,因为如果缓存池中没有会去storyboard中自动创建ID相符的。
注意一跳多(联系人列表跳到编辑或者添加),要判断segue的目标控制器类型
使用NSObject的方法(通用方法)isKindOfClass:[XXX class],例如判断segue的目标控制器是不是MJAddViewController,如下:
根据目标控制器的类型不同进行分别处理。
Tip:isKindOfClass方法可以透过id类型“看穿”真正的类型。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
id vc = segue.destinationViewController; if ([vc isKindOfClass:[MJAddViewController class]]) { // 如果是跳转到添加联系人的控制器
// 设置下一个控制器(添加联系人的控制器)的代理
MJAddViewController *addVc = vc;
addVc.delegate = self;
} else if ([vc isKindOfClass:[MJEditViewController class]]) { // 如果是跳转到查看(编辑)联系人的控制器
MJEditViewController *editVc = vc;
// 取得选中的那行
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
editVc.contact = self.contacts[path.row];
editVc.delegate = self;
}
}
细节5:编辑页面应该利用BarButtonItem来控制是否可以编辑,点击编辑开始编辑(自动弹出键盘),然后编辑按钮变为取消,点击取消则退出编辑。
Tip:tableView的indexPathForSelectedRow可以获得选中的行。
注意,在顺传数据到下一个控制器时,在perpareForSegue方法中还没有创建下一个控制器的控件,因此在目标控制器的set方法中接收到模型进行控件初始化是不会成功的,应该在viewDidLoad方法中进行模型数据到控件的初始化。
Tip:由于指向数组和模型的都是指针,因此不论是哪里的指针修改了原来的内容都会变化。
细节6:tableView的分割线设定为没有内容的没有分割线,有内容的有分割线,系统并不支持,应该隐藏系统的线,然后自己加一条线。
系统自带的分割线的实质就是View。
首先应当取消系统自带的分割线:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
为了自定义分割线,应该在cell的初始化方法中进行,但是从storyboard(xib)中创建的cell不会调用initWithStyle方法来初始化cell(手写代码创建cell时才会调用),但是会调用awakeFromNib方法,因此应该在这个方法里面初始化cell:
Tip:注意不要在初始化方法中修改frame,因为这时的frame还不是最终尺寸,应该在layoutSubviews方法中初始化。
//从storyboard或者xib中创建的,会调用这个方法。
- (void)awakeFromNib{ UIView *divider = [[UIView alloc] init];
divider.backgroundColor = [UIColor blackColor];
[self.contentView addSubview:divider]; }
在layoutSubviews来修改frame:
//从这里拿到的尺寸是最终的
- (void)layoutSubviews{ CGFloat dividerW = self.frame.size.width;
CGFloat dividerH = 1;
CGFloat dividerX = 0;
CGFloat dividerY = self.frame.size.height - dividerH;
self.divider.alpha = 0.2;
self.divider.frame = CGRectMake(dividerX, dividerY, dividerW, dividerH); }
(三十八)从私人通讯录引出的细节II -数据逆传 -tableView点击 -自定义分割线的更多相关文章
- (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时
细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Java进阶(三十八)快速排序
Java进阶(三十八)快速排序 前言 有没有既不浪费空间又可以快一点的排序算法呢?那就是"快速排序"啦!光听这个名字是不是就觉得很高端呢. 假设我们现在对"6 1 2 7 ...
- SQL注入之Sqli-labs系列第三十八关、第三十九关,第四十关(堆叠注入)
0x1 堆叠注入讲解 (1)前言 国内有的称为堆查询注入,也有称之为堆叠注入.个人认为称之为堆叠注入更为准确.堆叠注入为攻击者提供了很多的攻击手段,通过添加一个新 的查询或者终止查询,可以达到修改数据 ...
- 微信小程序把玩(三十八)获取设备信息 API
原文:微信小程序把玩(三十八)获取设备信息 API 获取设备信息这里分为四种, 主要属性: 网络信息wx.getNetWorkType, 系统信息wx.getSystemInfo, 重力感应数据wx. ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...
- bp(net core)+easyui+efcore实现仓储管理系统——入库管理之二(三十八)
abp(net core)+easyui+efcore实现仓储管理系统目录 abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+ ...
- Deep learning:三十八(Stacked CNN简单介绍)
http://www.cnblogs.com/tornadomeet/archive/2013/05/05/3061457.html 前言: 本节主要是来简单介绍下stacked CNN(深度卷积网络 ...
- 【FastDev4Android框架开发】打造QQ6.X最新版本号側滑界面效果(三十八)
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50253925 本文出自:[江清清的博客] (一).前言: [好消息] ...
随机推荐
- ACM pie
我的生日快到了,传统上我正在做馅饼.不只是一个馅饼,不,我有N个,各种口味和各种尺寸. 数量为F我的朋友会来到我的聚会,每个人都得到一个馅饼. 这应该是一块馅饼,而不是几个小块,因为看起来很乱.这一块 ...
- 编写高性能的Lua代码
编写高性能的Lua代码 Posted on2014/04/18· 10 Comments 前言 Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏.像<魔兽世界>的插件, ...
- 【完整的App项目】颖火虫笔记v2
好久没写博客了,一方面是因为最近确实很忙,另一方面自己在改进颖火虫笔记这款App,在前面说过该App主要是模仿的印象笔记,(还不知道的,请看:http://blog.csdn.net/htq__/ar ...
- Android Studio精彩案例(四)《DrawerLayout使用详解仿网易新闻客户端侧边栏 》
转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 为了提高兴趣,咱们开头先看看最终要实现什么样的效果: 侧拉菜单在Android应用中非常常见,它的实现方式太多了,今天我们就说说使用G ...
- PGM:图模型学习概述
http://blog.csdn.net/pipisorry/article/details/52571640 动机 前面我们讨论的问题出发点是给定一个图模型.如在独立性和推理讨论中,假定模型--结构 ...
- ubuntu垃圾清理命令
ubuntu的空间莫名不够用了 通过系统自带的工具磁盘使用分析器,发现var文件下面的log100多个g,这个日志文件是可以删除的,然后tmp文件也是可以删除的. 1.sudo rm -rf /tmp ...
- DOM4J生成、解析XML实例
import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.Iterato ...
- 5.1、Android Studio用Logcat编写和查看日志
Android Studio在Android Monitor中包含了一个logcat的tab,可以打印系统事件,比如垃圾回收发生时,实时打印应用消息. 为了显示需要的信息,你可以创建过滤器,更改需要显 ...
- UNIX环境高级编程——初始化一个守护进程
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h&g ...
- windows与linux的文件夹共享
公司配备了一台性能还算不错的电脑,不过是台式机.我在上面装了ubuntu,但是我的代码工作目录全部都在我自己的win7笔记本上.有时程序开多了就容易卡,于是想到用装ubuntu的台式机来访问我win7 ...