IOS 期末复习考点
1. 表视图
1.1 数据源协议
- 在ios中表视图显示数据都要遵守 协议UITableViewDataSource(P111)
1.2 委托协议
- 在ios中表视图中执行操作的方法时,要遵守 协议UITableViewDataSource(P111)
1.3 简单表视图实例
-
图片:
-
#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. 键盘的关闭
-
点击背景View收起键盘(你的View必须是继承于UIControl)
-
[self.view endEditing:YES];
3.弹出框
3.1 实例
-
图片:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wrm92FWK-1608701692637)(D:\Program Files\Typora\image\image-20201201234427850.png)]
-
//默认只有标题和提示内容 没有操作的按钮的提示框,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];
```
-
参数讲解:
-
UIAlertController 的preferredStyle参数有两个样式
UIAlertControllerStyleAlert: 该样式显示在屏幕中央。 UIAlertControllerStyleActionSheet: 该样式显示在屏幕底部,自下而上推出。
-
UIAlertAction的style的参数有三个样式
UIAlertActionStyleDefault 是默认样式,白底黑字,响应touchUpInside事件。 UIAlertActionStyleCancel 是取消样式,与UIAlertActionStyleDefault唯一的不同就是它的字体加粗了。 UIAlertActionStyleDestructive 是具有警示性的样式,与UIAlertActionStyleDefault唯一的不同就是它的字体变为红色了
-
4. 数据存储
4.1 创建和读plist文件
4.1.1 手动创建的plist文件入下
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 使用偏好设置的步骤
- 创建NSUserDefaults 的实例, NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
- 通过编号设置保存不同类型的数据类型,详情见(P249)
- 设置了 偏好之后可以用过对应类型的数据类型进行读取,详情见(P249)
- 调用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 归档和反归档的使用
- 使用归档和反归档必须遵守NSCoding协议,NSString,NSArray等已经遵守了可以直接使用。
- 归档:以一种不可读的方式,将对象写入指定的文件中
- 反归档:从指定文件中读取数据,并自动重新归档
- 使用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 操作数据库的基础
- 在IOS中使用SQLite数据库,需要引入libsqlite3.tbd
- 其他详情见(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 手势识别的流程
- 定义手势识别对象
- 初始化手势识别对象
- 重写手势回调函数 -(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 属性动画
- 在属性动画中分为基础动画和关键帧动画,考点是基础动画,详情见(P315)
6.1.2 基础动画
- 基础动画使用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