0829-0606私人通讯录
0829-0606私人通讯录
创建single view 项目
1、删除storyboard - view controller ,拖一个NavigationController 删除里面的table view controller
2、拖4个UIviewController控件 搭建界面
3、登录界面控制器 的用户名和 密码控件监听 通知中心发出的 UITextFieldTextDidChangeNotification 通知 -dealloc 里remove监听者
通知中心发出文本内容改变的通知
- (void)viewDidLoad { [super viewDidLoad]; // 键盘输入就监听 NSNotificationCenter *notiCenter =[NSNotificationCenter defaultCenter]; [notiCenter addObserver:self selector:@selector(changeIngInput) name:UITextFieldTextDidChangeNotification object:self.userName]; [notiCenter addObserver:self selector:@selector(changeIngInput) name:UITextFieldTextDidChangeNotification object:self.passWord]; } - (void) changeIngInput { if (self.userName.text.length >0 && self.passWord.text.length >0) { self.loginButton.enabled = YES; }else{ self.loginButton.enabled = NO; } }
UIActionSheet //弹出确定框 如UIAlert
监听 textField监听系统发的textField文字改变的通知
UIApplication接收到的通知名称:UITextField***
[actionSheet showInView:self.view];
------------------------
UIStroyboardSegue
导航控制器从上往下push控制器不会销毁 从下往上pop操作上面的控制器会被pop并销毁 因为navigationControllers.items = @[vc1,vc2] 除非被pop掉了
就是push线 modal线等 ios8已经废弃掉了自动类型跳转了 用show 来代替push操作
segue的属性
@property (nonatomic,readonly) NSString *identifier;
@property (nonatomic,readonly) NSString *sourceViewController;
@property (nonatomic,readonly) NSString *destinationViewController;
自动调转的segue :用button push到目标控制器 在push之前也会执行prepareForSegue方法
手动类型segue(代码push并跳转): 通过代码来执行跳转的动作
1、拖线(来源控制器拖到目标控制器 push)(1个来源控制器可以拖 几个segue到 几个目标控制器上 代码根据segue的identifier来决定执行哪个segue)
2、设置这个线(segue)的identifier属性名称 和style:push等
3、代码来执行segue aaa的跳转动作 [self performSegueWithIndentifier:@"aaa" sender:nil]; //self为来源控制器
4、
5、延迟几秒 :dispatch_after - gcd
6、UIalertView
7、导入第三方框架***+**.h分类 MBProgressHUD
8、来源控制器 [self performSegue] 里执行了代码 [self prepareForSegue:(segue)]; 但是这个方法是空的 我们需要自己重写
- (IBAction)login {
[self performSegueWithIdentifier:@"segue1" sender:nil]; } -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { NSString *title = [NSString stringWithFormat:@"%@ 的联系人列表",self.userName.text]; [segue.destinationViewController setTitle:title]; }
- (void)performSegueWithIdentifier:@"" sender:(id) sender
{
UIStoryboardSegue *stroyboardSegue = [[UIStoryboardSegue alloc] init];
stroyboardSegue.sourceController = 来源控制器
stroyboardSegue.destinationController = 目标控制器
[self prepareForSegue:stroyboardSegue sender:sender];
来源控制器.navigationController push:目标控制器
}
self performSegue 里面创建了segue对象,来源和目标控制器对象, self perpareForSegue(segue) -》[segue persofm]执行调整动作 ,
9、vc.title === vc.navigationitem.title
10、从 下 往 上 传递数据
上在第一次push到下的时候 上的prepareForSegue 里将自己设置为下的代理 ,
下往上传递数据前 pop操作 不会立即自己释放掉 而是在栈顶视图出现后自己消失 ,所以下面的代码会继续执行
self.delegate addDateWithMyInPutText 上就得到相应数据刷新table
11、pop操作不会立即执行完毕
12、[textField becomeFistRespond]让键盘默认弹出
13、tableViewController-tableView-tableView cell 拖线到下一个控制器 push 完成点击事件的监听 控制器中cell的创建代码注释掉(系统就会去storyboard中找cell 设置可重用标识符) prePareForSegue里判断目标控制器为添加用户 那么久执行代理方法 否则不执行
14、segue上传下数据(navigationController push),给下控制器的view子控件设置值应该在下控制器的viewDidload()里设置 尤其是在涉及到segue的时候 因为控制器的view是懒加载的
15、自定义Cell 指定storyboard中- tableViewController - TableView - TableViewCell控件的类为自定义Cell
在数据源中创建自定义Cell
自定义cell必须有frame宽度高度 如果没有就会创建一个默认的frame
initWithStyle:style reuseIdentifier:resu//在有storyboard指定cell情况下 ,不要这样写了,因为storyboard已经有一个初始化cell的工作了 ,
如果要进一步对cell进行修改 可以在awakeFromNib里操作(cell子控件里补充初始化的东西 注意这里最好不要设置子控件的frame )
cell的子控件添加操作只能 [cell.contentView addSubView]
一句话 frame修改 或者子控件frame操作在layoutSubviews(布局子控件)
16、cell的自定义代码
// // NJContatcCell.m // 01-私人通讯录 // // Created by apple on 14-6-6. // Copyright (c) 2014年 heima. All rights reserved. // #import "NJContatcCell.h" #import "NJContatc.h" @interface NJContatcCell () @property (nonatomic, weak) UIView *divider; @end @implementation NJContatcCell + (instancetype)cellWithTableView:(UITableView *)tableView { static NSString *identifier = @"contatcs"; // 首先回去缓存池中找, 如果找不到回去storyboard中找有没有叫做contatcs的cell,有就创建 NJContatcCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; return cell; } - (void)setContatc:(NJContatc *)contatc { _contatc = contatc; // 设置名称 self.textLabel.text = _contatc.name; // 设置电话机 self.detailTextLabel.text = _contatc.phoneNumber; } // 该方法只有在通过代码创建控件的时候才会调用, 如果控件是通过xib或者storyboard创建出来的不会调用该方法 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // Initialization code NSLog(@"initWithStyle"); } return self; } // 如果控件是通过xib或者storyboard创建出来的就会调用该方法 // 该方法只会调用一次 - (void)awakeFromNib { // Initialization code NSLog(@"awakeFromNib"); // self.backgroundColor = [UIColor redColor]; // 创建分割线添加到cell中 UIView *view = [[UIView alloc] init]; view.backgroundColor = [UIColor blackColor]; view.alpha = 0.5; self.divider = view; // 注意不要直接将子控件添加到cell中 // [self addSubview:view]; [self.contentView addSubview:view]; } // 当控件的frame被修改的时候就会调用 // 一般在该方法中布局子控件 - (void)layoutSubviews { [super layoutSubviews]; // 设置分割线的frame CGFloat x = 0; CGFloat h = 1; CGFloat w = self.frame.size.width; CGFloat y = self.frame.size.height - h; self.divider.frame = CGRectMake(x, y, w, h); } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; // Configure the view for the selected state } @end
----------
数据存储
xml - plist 存储常用数据类型
preference(偏好设置) 本质也是plist 利用NSUserdefault 对象自动保存数据到preferences目录里的***.plist里 这个不需要掌握
NSKeyedArchiver归档(NSCoding) 自定义对象的存储
SQLite3
Core Data (数据库缺点不能存储对象 那么Core Data可以存储对像 实际上本质也是SQLite)
----------
沙盒中Documents位置获取
记住一点 数据放到Documents里就好了
1、获取Document文件夹路径
NSHomeDirectory(); //applications/232334***应用程序
[home stringByAppendingString:@"/Documents"];
[home stringByAppendingPathComponent:@"Documents"];
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
component代表/或者\ NSUserDomainMask代表文件夹
2、写到文件里 [dict writeToFile:path atomically:YES]; //yes表示安全写入 先写入临时的 完全写好了 再写入真实的文件里
3、获取文件内容 [NSDictionary dictionaryWithContentsOfFile:path];
其他:
(程序员创建的应用程序包和 程序员代码实现保存的数据 itunes同步有的数据文件夹会被保存到手机 有的不会同步保存)位置:
【由 于不同电脑位置不同 所以这个可以不看 /Users/apple/Library/Application Support/iPhone Simulator/7.0/Applications (apple是用户名, 7.0是模拟器版本) 代码部署到6.1系统的手机上这里的位置就是6.1】
代码查看应用程序所在在模拟器沙盒文件的位置 /applications/32323ssuuw888应用程序A/

ios8开放了不同应用程序互相访问其沙盒
文件在itunes上同步(备份操作iphone ipad应用和内容的作用)的时候会被保存在itunes上
layer是应用程序压缩包 不能存东西
【 记住一点即可 数据放到Documents里就好了
Documents
Library
Caches 很多不重要的大文件存放位置 不会被同步
Preferences 【这个不用管,系统自动放数据 系统的偏好设置iphone-setting信息会保存在这里 我们一般不保存数据在这里 ,用户的偏好数据 如打开应用程序sogou 有一个偏好设置字体颜色 下次同步数据后这个会保存 】
tmp 应用程序结束 应该清理 系统也可能会自动清理 不会被itunes同步保存
】
-----------
NSUserDefaults - preference偏好设置
NSUserdefaults 自动保存数据到 preference文件夹下 但是只能保存一个plist(一个Array 下的n个dictionary的数据)
所以一般数据不在这里保存
1、NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2、[defaults setObject:@"lnj" forKey:@"name"]; // 这个不是立即生效
3、 [defaults synchronize]; //所以需要立即同步
获取偏好设置内容
1、NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
2、[defaults objectForKey:@"name"];

// NJViewController.m // 偏好设置 #import "NJViewController.h" @interface NJViewController () - (IBAction)saveBtn:(id)sender; - (IBAction)readBtn:(id)sender; @end @implementation NJViewController - (IBAction)saveBtn:(id)sender { // 偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要再偏好设置中保存其他数据 // 如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的 // 偏好设置会将所有的数据保存到同一个文件中 // 获取NSUserDefaults对象 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 保存数据(如果设置数据之后没有同步, 会在将来某一时间点自动将数据保存到Preferences文件夹下面) [defaults setObject:@"lnj" forKey:@"name"]; [defaults setObject:@"man" forKey:@"gender"]; [defaults setInteger:13 forKey:@"age"]; [defaults setDouble:10.1 forKey:@"height"]; // 让NSUserDefaults立刻保存数据 [defaults synchronize]; } - (IBAction)readBtn:(id)sender { // 1.获取NSUserDefaults NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 2.通过NSUserDefaults获取保存的数据 NSString *name = [defaults objectForKey:@"name"]; int age = [defaults integerForKey:@"age"]; NSLog(@"%@", name); NSLog(@"%d", age); } @end
preferences的应用场景如下: 登录过后 保存第一次登录选择和写入的数据
----
对象文件归档 KeydArchiver
1、[NSKeyedArchiver archiveRootObject:stu toFile:path]; //入档操作
2、Person对象和 Student对象 实现 NSKeydArchiver协议 <NSCoding>
实现2个方法 入档时方法
encodeWithCoder initWithCoder 解档方法 initWithCoder //入档、解档协议方法
-(void)encodeWithCoder:(NSCoder *)aCoder { [super encodeWithCoder:aCoder]; [aCoder encodeInteger:self.weight forKey:@"weight"]; } -(id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { self.weight = [aDecoder decodeIntegerForKey:@"weight"]; } return self; }
3、[NSKeyedUnarchiver unarchiveObjectWithFile:path];//接档操作
-----
显示隐藏文件 桌面操作这里不介绍了
显示:defaults write com.apple.finder AppleShowAllFiles -bool true
隐藏:defaults write com.apple.finder AppleShowAllFiles -bool false
finder->强制退出-》重启finder
-----
View和控制器的创建
初始化创建的时候采用 获取xib和不获取xib的方式
控制器有自动初始化view的操作
-------
其他不重要的