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
NSUserdefaults对象自动保存数据到Preference目录下的***.plist里

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的操作

 

 -------

其他不重要的

 

posted @ 2016-03-04 23:22  海龙王来了  阅读(196)  评论(0)    收藏  举报
友情链接:废钢破碎机  带式压滤机