IOS期末复习

IOS 期末复习考点

1. 表视图

1.1 数据源协议

  1. 在ios中表视图显示数据都要遵守 协议UITableViewDataSource(P111)

1.2 委托协议

  • 在ios中表视图中执行操作的方法时,要遵守 协议UITableViewDataSource(P111)

1.3 简单表视图实例

  1. 图片:
    在这里插入图片描述

  2. #import "ViewController.h"
    @interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
    @property (weak, nonatomic) IBOutlet UITableView *carview;   // 表视图对象
    @property (weak, nonatomic) NSArray *cars; //定义数组对象
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.carview.dataSource=self;  // 设定数据源,没有这句话不能显示值
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    // 懒加载,实现把cars.plist的数据读到 数组中去
    -(NSArray*) cars
    {
        if(_cars==nil)
        {
            //pathForResource:@"cars.plist" 时,ofType:nil
            NSString *path=[[NSBundle mainBundle] pathForResource:@"cars" ofType:@"plist"];
            NSArray *arr=[NSArray arrayWithContentsOfFile:path];
            _cars=arr;
        }
        return _cars;
    }
    
    // 设置表视图有多少个分组,我们不分组所以返回1
    -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView
    {
        return 1;
    }
    
    // 设置表视图中有几行,我们一行存储一个数组元素,所以行数和数组元素个数相同
    -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.cars.count;
    }
    
    // 给单元格赋值
    -(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 定义一个单元格对象
        UITableViewCell *cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
        // 获取行数
        int i=indexPath.row;
        //设置图片(cars[i] 是一个字典对象,所以self.cars[i][@"icom"] 是取出键值魏"icom"的值)
        cell.imageView.image=[UIImage imageNamed:self.cars[i][@"icom"]];
        cell.textLabel.text=self.cars[i][@"name"];
        return cell;
    }
    @end
    

2. 键盘的关闭

  1. 点击背景View收起键盘(你的View必须是继承于UIControl)

  2. [self.view endEditing:YES];
    

3.弹出框

3.1 实例

  1. 图片:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrm92FWK-1608701692637)(D:\Program Files\Typora\image\image-20201201234427850.png)]

  2.    //默认只有标题和提示内容 没有操作的按钮的提示框,alertControllerWithTitle 标题,message 提示内容
       UIAlertController  *alertC=[UIAlertController alertControllerWithTitle:@"提示" message:@"请填写完整的    信息" preferredStyle:UIAlertControllerStyleAlert];
        
        //添加确认操作的按钮 UIAlertAction actionWithTitle 标题, UIAlertActionStyleDefault 出现位置
        UIAlertAction *action=[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault           handler:nil];
      //将action添加到控制器
    

[alertC addAction:action];
// 显示弹出框
[self presentViewController:alertC animated:YES completion:nil];
```

  1. 参数讲解:

    1. UIAlertController 的preferredStyle参数有两个样式

      UIAlertControllerStyleAlert:        该样式显示在屏幕中央。
      UIAlertControllerStyleActionSheet:  该样式显示在屏幕底部,自下而上推出。
      
    2. UIAlertAction的style的参数有三个样式

      UIAlertActionStyleDefault      是默认样式,白底黑字,响应touchUpInside事件。
      UIAlertActionStyleCancel       是取消样式,与UIAlertActionStyleDefault唯一的不同就是它的字体加粗了。
      UIAlertActionStyleDestructive  是具有警示性的样式,与UIAlertActionStyleDefault唯一的不同就是它的字体变为红色了
      

4. 数据存储

4.1 创建和读plist文件

4.1.1 手动创建的plist文件入下
image-20201202113629452
4.1.2 实例
#import "ViewController.h"
# define FileName @"book.plist"  // 要保存的plist文件
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *createPlist;
@property (weak, nonatomic) IBOutlet UIButton *readPlist;
- (IBAction)create:(id)sender;
- (IBAction)read:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
- (IBAction)read:(id)sender {
    
   // 从book.plist获取数据
    NSArray *bookArr =[NSArray arrayWithContentsOfFile:[self filePath]];

    //输出数据  bookArr[i] 代表一个字典,取一个字典的值[@"属性名"]
    for(int i=0;i<bookArr.count;i++)
    {
        NSLog(@"name:%@,authour:%@",bookArr[i][@"name"],
              bookArr[i][@"author"]);
    }
}
// 获取plist文件的路径
-(NSString*)filePath
{
    //获取应用程序的沙盒目录的路径数组
    NSArray *array=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
    // 数组第一个就是Document的路径
    NSString  *path=[array objectAtIndex:0]; 
  // 返回plist文件的路径
  return [path stringByAppendingPathComponent:FileName];
}
- (IBAction)create:(id)sender {

    // 创建一个可变数组
    NSMutableArray *bookarr =[NSMutableArray array];
    //创建一个字典对象存储书的信息
    NSMutableDictionary *bookDic1 =[[NSMutableDictionary alloc]init];
    // 添加键值
    bookDic1[@"author"]=@"严蔚敏";
    bookDic1[@"name"]=@"数据结构";
    
    //创建一个字典对象存储书的信息
       NSMutableDictionary *bookDic2 =[[NSMutableDictionary alloc]init];
       // 添加键值
       bookDic2[@"author"]=@"谭浩民";
       bookDic2[@"name"]=@"C语言程序设计";
    
    //把字典对象添加到数组中
    
    [bookarr addObject:bookDic1];
    [bookarr addObject:bookDic2];
    
    //将数组对象存储到plist文件中
    if([bookarr writeToFile:[self filePath] atomically:YES])
    {
        //弹出框提示保存成功,可以不写,只执行[bookarr writeToFile:[self filePath] atomically:YES]这个方法就行
        UIAlertController  *alertC=[UIAlertController alertControllerWithTitle:@"提示" message:@"保存成功"         preferredStyle:UIAlertControllerStyleAlert];
        
        UIAlertAction *action=[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault             handler:nil];
        [alertC  addAction:action];
        [self presentViewController:alertC animated:YES completion:nil];
    }
}
@end


4.2 偏好设置

4.2.1 使用偏好设置的步骤
  1. 创建NSUserDefaults 的实例, NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
  2. 通过编号设置保存不同类型的数据类型,详情见(P249)
  3. 设置了 偏好之后可以用过对应类型的数据类型进行读取,详情见(P249)
  4. 调用synchronize实现同步
4.2.2 实例
#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIButton *btnSave;
@property (weak, nonatomic) IBOutlet UIButton *btnRead;
- (IBAction)Save:(id)sender;
- (IBAction)Read:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
//  定义 NSUserDefaults对象
NSUserDefaults *userDefault=nil;
//偏好存储数据
- (IBAction)Read:(id)sender {
    //创建NSUserDefaults对象保存数据
     userDefault=[NSUserDefaults standardUserDefaults];
     //创建一个动态数组
      NSMutableArray *tempArray = [NSMutableArray array] ;
      
     //创建字典,存储书本信息
      NSDictionary * book1 =
    @{@"name":@"数据结构",
      
      @"author":@"严尉敏",

      @"price":@"54.8"
      
      };
    
      // 把字典存入数组
      [tempArray addObject:book1];
      
      NSDictionary * book2 =
      @{@"name":@"iOS程序设计",
      
        @"author":@"黑马",
        
        @"price":@"45.2"
        
        };
      [tempArray addObject:book2];
      
      //把数组保存到文件中去
      [userDefault setObject:tempArray forKey:@"arrItem"];
      //实现同步
      [userDefault synchronize];
      NSLog(@"保存成功");
}

- (IBAction)Save:(id)sender {
              // 从userDefault对象中取出数据
              NSArray *bookArr= [userDefault objectForKey:@"arrItem"];
              // 遍历打印输出
              for(int i=0;i<bookArr.count;i++)
              {
                  NSLog(@"%@,%@,%@",bookArr[i][@"name"],bookArr[i][@"author"],bookArr[i][@"price"]);
              }
}

@end

4.3 归档和反归档

4.3.1 归档和反归档的使用
  1. 使用归档和反归档必须遵守NSCoding协议,NSString,NSArray等已经遵守了可以直接使用。
  2. 归档:以一种不可读的方式,将对象写入指定的文件中
  3. 反归档:从指定文件中读取数据,并自动重新归档
  4. 使用NSCoding 必须实例化归档和反归档的两个方法。详情见(P254)
4.3.2 实例
// book对象的头文件
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface Book : NSObject <NSCoding>
// 定义三个属性
@property (nonatomic,copy) NSString *name;  // 书名
@property (nonatomic,copy) NSString *author;  // 作者
@property (nonatomic,assign) double price; // 价格
// 定义初始化book对象的方法
-(id)initBookWithName:(NSString *)n andAuthor: (NSString *)a andPrice: (double) p;

@end

NS_ASSUME_NONNULL_END

#import "Book.h"

@implementation Book
// 实现实例化book对象的方法
-(id)initBookWithName:(NSString *)n andAuthor: (NSString *)a andPrice: (double) p
{
    if(self=[super init])
    {
        _name=n;
        _author=a;
        _price=p;
    }
    
    return  self;
}

// 归档时调用的方法,不同对象有不同的归档方法,详情见(P254)
-(void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:@"name" ];
    [aCoder encodeObject:_author forKey:@"author" ];
    [aCoder encodeDouble:_price forKey:@"price"];
}
// 反归档时调用的方法,不同对象有不同的烦归档方法,详情见(P254)
-(id)initWithCoder:(NSCoder *)aDecoder
{
    if(self=[super init])
    {
        _name =[aDecoder decodeObjectForKey:@"name"];
        _author =[aDecoder decodeObjectForKey:@"author"];
        _price=[aDecoder decodeDoubleForKey:@"price"];
    }
    return self;
}

//反回对象的信息
-(NSString *)description
{
    return [NSString stringWithFormat:@"%@,%@,%lf",self.name,self.author,self.price];
}
@end

#import "ViewController.h"
#import "Book.h"
@interface ViewController ()
- (IBAction)btnReadDirInfo:(id)sender;
- (IBAction)btnReadbooklist:(id)sender;
@property(nonatomic,copy)NSString *docPaah; // 定义归档文件的路径
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
   
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

// 获取归档文件的路径
-(NSString *) docPaah
{
    if(_docPaah==nil)
    {
        NSString *path =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        _docPaah=path;
    }
    return _docPaah;
}

// 归档
- (IBAction)myArchive:(id)sender {
   // 定义两个book 对象
    Book *ds=[[Book alloc] initBookWithName:@"数据结构" andAuthor:@"严蔚敏" andPrice:54.8];
    Book *ds2=[[Book alloc] initBookWithName:@" iOS程序设计" andAuthor:@"黑马" andPrice:45.2];
 
  // 把book对象加入数组
  NSArray *book =[[NSArray alloc] initWithObjects: ds, ds2,nil];
  //获取路径
   NSString *filePath= [self.docPaah stringByAppendingPathComponent:@"book.data"];
   // 将数组进行归档
    [NSKeyedArchiver archiveRootObject:book toFile:filePath];
    
}
// 反归档
- (IBAction)myUnarchive:(id)sender {
    // 获取文件路径
    NSString *filePath=[self.docPaah stringByAppendingPathComponent:@"book.data"];
    // 将文件进行反归档
    NSArray *book =[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    //打印数组中book对象的信息
    for(int i=0;i<book.count;i++)
    {
        NSLog(@"%@",book[i]);
    }
}

@end

4.4 数据库操作

4.4.1 操作数据库的基础
  1. 在IOS中使用SQLite数据库,需要引入libsqlite3.tbd
  2. 其他详情见(P261)
4.4.2 数据实例

#import "ViewController.h"
#import "Book.h"
#import "sqlite3.h"
@interface ViewController ()
- (IBAction)btnReadDirInfo:(id)sender;
- (IBAction)btnReadbooklist:(id)sender;
@property(nonatomic,copy)NSString *docPaah;
@end



@implementation ViewController
// 数据库对象
static sqlite3 *db=NULL;

- (void)viewDidLoad {
    [super viewDidLoad];
    //调用创建数据库和表的方法
    [self CreateTbaleAndDatabas];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

//创建数据库和表
-(void)CreateTbaleAndDatabas
{
    //获取沙盒路径
    NSString *docDir=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask , YES)    firstObject];
    //创建数据库的路径
    NSString *dataBasePath=[docDir stringByAppendingPathComponent:@"database.sqlite"];
    //如果数据库存在就返回数据库对象,如果数据库不存在就会新创建一个数据库对象返回 ,sqlite3_open() 打开数据库
    int result= sqlite3_open([dataBasePath UTF8String], &db);
    //判断数据库是否打开成功
    if (result==SQLITE_OK)
    {
        NSLog(@"数据库打开成功");
        NSLog(@"%@",dataBasePath);
    }else
    {
         NSLog(@"数据库打开失败");
    }
    //建表,SQLite的数据类型见(P260)
    const char *sql ="create table if not exists bookinfo(id integer primary key autoincrement, name  text not null, author text not null,price real not null)";
    char *errmsg=NULL;
    //执行建表语句。
    result =sqlite3_exec(db, sql,NULL, NULL, &errmsg);
    if(result==SQLITE_OK)
    {
        NSLog(@"创表成功");
    }else
    {
        NSLog(@"创建表失败--%s--%s--%d",errmsg,__FILE__,__LINE__);
    }
}
//数据库添加数据的方法
-(void)dbInsertValue:(NSString *)sql
{
   
    //接收返回来的错误消息
    char *error=nil;
    sqlite3_exec(db,sql.UTF8String, NULL, NULL, &error);
    if(error)
    {
        NSLog(@"添加失败");
    }else
    {
        NSLog(@"添加成功");
    }
    
}

// 把数据存入数据库
- (IBAction)dbSaveBook:(id)sender {
    // 定义添加数据的SQL 语句,基础类型用(整数:%d, 浮点型:%f),对象用%@
     NSString *sql =[NSString stringWithFormat:@"insert into bookinfo             (name,author,price)values('%@','%@',%lf);",@"数据结构",@"严蔚敏",54.8];
     // 调用添加方法执行添加
    [self dbInsertValue:sql];
    
    NSString *sql1 =[NSString stringWithFormat:@"insert into bookinfo (name,author,price)values('%@','%@',%lf);",@"iOS程序设计",@"黑马",45.2];
    
    [self dbInsertValue:sql1];
}


// 从数据库中把数据读出来
- (IBAction)dbReadBook:(id)sender {
    // 定义要查询的SQL语句
    const char *sql ="select *from bookinfo";
    //定义 sqlite3_stmt,用于提取数据
    sqlite3_stmt *stmt;
    // 检查SQL 语句是否正确
    int result =sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
    // 准备完成,没有错
    if(result==SQLITE_OK)
    {
        // 提取查询结果到stmt,一次取一条
        // 如果返回值魏SQLITE_ROW,表示提取到了一条数据
        while(sqlite3_step(stmt)== SQLITE_ROW)
        {
             //取出提取到的记录中的第0列的数据,不同的数据类型提取方式是不一样的,例如:
             //sqlite3_column_int() ,是用来提取int类型的数据
            int id=sqlite3_column_int(stmt,0);
            const unsigned char * name= sqlite3_column_text(stmt, 1);
            const unsigned char *author= sqlite3_column_text(stmt, 2);
            double price= sqlite3_column_double(stmt, 3);
            NSLog(@"%d,%s,%s,%lf",id,name,author,price);
        }
    }
}

@end

5. 手势识别

5.1 手势识别的流程

  1. 定义手势识别对象
  2. 初始化手势识别对象
  3. 重写手势回调函数 -(void) swipe:(UISwipeGestureRecognizer*) recognizer

5.2 实例

#import "ViewController.h"

@interface ViewController ()
//定义一个图片属性
@property(weak,nonatomic)IBOutlet UIImageView *emotionView;
//定义两个属性,分别表示向左扫和向右扫识别器
@property(nonatomic,strong) UISwipeGestureRecognizer *swipeLeft;
@property(nonatomic,strong) UISwipeGestureRecognizer *swipeRight;

// 定义图片的下标索引
@property(nonatomic,assign) int index;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 初始化左侧和右侧方向手势识别器
    self.swipeLeft=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
      self.swipeRight=[[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipe:)];
    // 把两个手势识别放到主视图
    [self.view addGestureRecognizer:self.swipeLeft];
    [self.view addGestureRecognizer:self.swipeRight];
    
    // 设置识别器检测的清扫方向
    self.swipeLeft.direction =
           UISwipeGestureRecognizerDirectionLeft;
    self.swipeRight.direction =  UISwipeGestureRecognizerDirectionRight;
    
    // 初始化下标
    self.index=1;
    //调用display 方法切换图片下标
    [self display:self.index];
}

// 检测到手势,调用的方法
- (void)swipe:(UISwipeGestureRecognizer*)recognizer
{
    // 判断手势是向左还是向右
    if(recognizer.direction == UISwipeGestureRecognizerDirectionLeft)
    {
         向左时图片的下标+1 ,如果大于4就回到第一张(因为图片只有4张)
        self.index++;
        if(self.index>4) self.index=1;
        
      
    }else
    {
        向左时图片的下标-1 ,如果小于于1就回到最后一张(因为图片只有4张)
        self.index--;
        if(self.index<1) self.index=4;
        
    }
    // 调用display方法 设置图片的下标
    [self display:self.index];
    
}
// 显示图片
-(void) display:(int)index
{
    // 设置下标
    NSString *name =[NSString stringWithFormat:@"%d.jpg",index];
    // 显示图片
    self.emotionView.image=[UIImage imageNamed:name];
}

@end

6. 核心动画

6.1 属性动画

  1. 在属性动画中分为基础动画和关键帧动画,考点是基础动画,详情见(P315)
6.1.2 基础动画
  1. 基础动画使用CABasicAnimation类表示,使用它只需要指定动画的开始时间和结束时间即可。详情见(P315)
6.1.3 实例
//
//  ViewController.m
//  属性动画
//
//  Created by ssr on 2020/12/2.
//  Copyright © 2020 ssr. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()
@property (strong, nonatomic)  UIImageView *iconView;

@end

@implementation ViewController


-(UIImageView *)iconView
{
    if(!_iconView)
    {
        _iconView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"heart"]];
        [self.view addSubview:_iconView];
    }
    return _iconView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // 指定图像居中
    self.iconView.center=self.view.center;
}

// 实现渐变的动画
-(void)alphaChangedAnimation
{
    
    //创建一个基本动画,并指定可动画属性
    CABasicAnimation * basicAnimation=[CABasicAnimation animationWithKeyPath:@"opacity"];
    // 设置起始值
    basicAnimation.fromValue=@1.0;
    // 设置目标值
    basicAnimation.toValue=@0.0;
    //设置重复次数
    basicAnimation.repeatCount=MAXFLOAT;
    // 设置动画时长
    basicAnimation.duration=2.0f;
    // 添加到iconView 图层
    [self.iconView.layer addAnimation:basicAnimation forKey:nil];
}
// 实现缩放的动画
-(void)scaleAnimation
{
    
    //创建一个基本动画,并指定可动画属性
    CABasicAnimation * basicAnimation=[CABasicAnimation animationWithKeyPath:@"transform.scale"];
    // 设置起始值
    basicAnimation.fromValue=@1.0;
    // 设置目标值
    basicAnimation.toValue=@0.5;
    //设置重复次数
    basicAnimation.repeatCount=MAXFLOAT;
    // 设置动画时长
    basicAnimation.duration=2.0f;
    // 添加到iconView 图层
    [self.iconView.layer addAnimation:basicAnimation forKey:nil];
    
}

//  触摸开始的方法
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    
    // 获取触摸点
    CGPoint point= [[touches anyObject] locationInView:self.view];
    
    // 实现渐变的动画
    [self alphaChangedAnimation];
    // 实现缩放的动画
    [self  scaleAnimation];
    
}

@end

ew 图层
[self.iconView.layer addAnimation:basicAnimation forKey:nil];

}

// 触摸开始的方法
-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{

// 获取触摸点
CGPoint point= [[touches anyObject] locationInView:self.view];

// 实现渐变的动画
[self alphaChangedAnimation];
// 实现缩放的动画
[self  scaleAnimation];

}

@end

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值