{
24、Sqlite数据库
1、存储大数据量,增删改查,常见管理系统:Oracle、MSSQLServer、DB2、MySQL、sqlite
2、本地数据库,存在沙盒
3、数据持久化: 属性列表plist文件(字典、数组、nsnumber、nadata)
对象归档(对象)
Sqlite数据库
CoreData(iOS独有)
4、字段存储类型: NULL、INTEGER、REAL(浮点值)、TEXT、BLOB(二进制数据)
5、mac x 有很多苹果破解的软件
6、Navigate Premium软件,编辑数据库
SQlite -> New Sqlite 3 -> 保存
new table 命名规则:t_student
7、主键约束(唯一,不为空)
一、代码创建数据库SQ语言,大小随意(全背下来)
1、创建表,不能用单行注释
CREATE TABLE IF NOT EXISTS t_movie (name TEXT , id INTEGER);
CREATE TABLE t_movie (name TEXT , id INTEGER);
2、删表
DROP TABLE IF EXISTS t_movie;
DROP TABLE t_movie;
3、插入
INSERT INTO t_student (name,age) VALUE(‘小王’,12);
4、更新
UPDATE t_student SET name = ‘小女神’; //更新所有
5、删除
DELETE FROM t_student; //删所有
DELETE FROM t_student WHERE age = 12;
DELETE FROM t_student WHERE age = 15 and name = ‘小刘’;
6、查询
SELECT *FROM t_stdent;
SELECT name,age FROM t_student;
SELECT *FROM s_tudent WHERE age > 20;
7、计算
SELECT count(*) FROM t_student;
SELECT count(name) FROM t_student;
SELECT count(name) FROM t_student WHERE age > 20;
SELECT * FROM t_student limit 4,8; //01234(56789…)
8、排序
SELECT *FROM t_student
二、主键约束(PK)
1、创建
CREATE TABLE t_movie (id INTEGER PRIMARY KEY,name TEXT);
三、外键(FK)
四、代码实现数据库
1、构造路径
NSString *don’tbFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/test.db"];
2、添加sqlite3.h,并添加头文件
3、打开数据库,如果不存在,会帮助我们创建一个
//创建一个数据库(全局变量)
_db = nil;
int result = sqlite3_open(dbFilePath.UTF8String, &_db);
4、判断是否创建成功
if (result == SQLITE_OK) {
5、创建表
char *errmsg = NULL;
sqlite3_exec(_db, "CREATE TABLE IF NOT EXISTS t_user (id integer PRIMARY KEY, name text, age integer)", NULL, NULL, &errmsg);
6、插入数据
char *error = NULL;
//拼接插入的数据
NSString *insertString = [NSString stringWithFormat:@"INSERT INTO t_user (name,age) VALUES ('%@', %ld)", _nameText.text, [_ageText.text integerValue]];
//插入
sqlite3_exec(_db, insertString.UTF8String, NULL, NULL, &error);
7、取出数据
//查询到结果
sqlite3_stmt *stmt = NULL;
int result = sqlite3_prepare(_db, "SELECT * FROM t_user", -1, &stmt, NULL);
if (result == SQLITE_OK) {
//sqlite3_step(stmt) == SQLITE_ROW
//指向下一条数据,如果等于SQLITE_ROW 代表查询到数据
while (sqlite3_step(stmt) == SQLITE_ROW) {
//取出一条数据,名字的数据 1代表第二条数据(0代表第一条数据)
const unsigned char *name = sqlite3_column_text(stmt, 1);
//取出一条数据,年龄的数据 2代表第三条数据
int age = sqlite3_column_int(stmt, 2);
NSLog(@"name = %s, age = %d", name, age);
}
}
五、FMDB
1、导入第三方框架,编译一下
2、导入编译文件libsqlite3.0
3、构造(寻找)存储数据库的路径
NSString *dbFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/fmdb.db"];
4、打开数据库,返回对象
_fmdb = [FMDatabase databaseWithPath:dbFilePath];
5、真正打开数据库,返回布尔值
BOOL isSuccess = [_fmdb open];
6、查询表
(1)、执行查询操作的方法
[_fmdb executeQuery:<#(NSString *), ...#>]
(2)、除了查询操作以外的所有操作,都用下面的方法
BOOL result = [_fmdb executeUpdate:@"CREATE TABLE IF NOT EXISTS t_user (id integer PRIMARY KEY, name text NOT NULL, age integer)"];
7、插入数据
BOOL result = [_fmdb executeUpdateWithFormat:@"INSERT INTO t_user (name, age) VALUES (%@,%ld)", name, age];
如果一次性需要操控大量的数据.就不要在主线程中执行,会阻塞
如果为异步操作,数据库插入数据,一定要避免多个线程操纵数据库
FMDB解决了这个问题,需要用到FMDatabaseQueue
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbFilePath];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
[queue inDatabase:^(FMDatabase *db) {
BOOL result = [db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_user (id integer PRIMARY KEY,name text NOT NULL , age integer)"];
for (int i = 0; i <200; i++) {
BOOL result = [db executeUpdateWithFormat:@"INSERT INTO t_user (name,age) VALUES (%@,%ld)",name,age];
}
}];
8、更新
BOOL result = [_fmdb executeUpdateWithFormat:@"UPDATE t_user SET name = %@ WHERE id = 1", @"小女神"];
9、查询数据
(1)、游标
FMResultSet *result = [_fmdb executeQuery:@"SELECT * FROM t_user"];
(2)、往下游,查找数据
while (result.next) {
//查询一条数据中的字段
NSString *name = [result stringForColumn:@"name"];
int age= [result intForColumn:@"age"];
}
10、模糊查询
LIKE
六、CoreData
1、建立数据模型CoreData
2、导入头文件
3、加载数据模型文件
(1)、获取程序包路径
NSString *path = [[NSBundle mainBundle] resourcePath];
NSLog(@"%@", path);
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"MovieData.momd" ofType:nil];
(2)、根据路径接收模型
NSManagedObjectModel *managerModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];
3、创建数据存储调度器,用来设置储存方式(如果不存储数据库,帮助我们创建一个数据库)
NSPersistentStoreCoordinator *coordiantor = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managerModel];
(1)、指定数据库的路径
NSString *dbPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/CoreData.db"];
(2)、创建error接收错误
NSError *error = nil;
(3)、打开数裤
[coordiantor addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil
URL:[NSURL fileURLWithPath:dbPath]
options:nil
error:&error];
4、创建上下文,存储数据,更新数据,查询数据
ctx = [[NSManagedObjectContext alloc]init];
5、如果上下文想要对数据库进行操作,必须和coordinator产生联系
[ctx setPersistentStoreCoordinator:coordinator];
6、存储数据,将对象映射到数据库
(1)、创建模型对象
(2)、接收数据
(3)、将数据添加到上下文
(4)、将数据保存到数据库,返回布尔值
7、查询
(1)、创建请求的对象
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Movie"];
(2)、使用request,使用谓词来设置过滤条件
NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"rating" ascending:YES];
(3)、设置升序或者是降序
request.sortDescriptors = @[sort];
(4)、根据请求返回数据
NSArray *result = [ctx executeFetchRequest:request error:nil];
(5)、for (Movie *m in result) {
NSLog(@"标题:%@,时间:%@,评分:%@",m.title,m.year,m.rating);
}
8、插入
(1)、存储数据,将对象直接映射到数据库了
Movie *movie = [NSEntityDescription insertNewObjectForEntityForName:@"Movie" inManagedObjectContext:ctx];
movie.title = _titleText.text;
(2)、将字符串转换成NSNumber
movie.rating = @([_ratingText.text doubleValue]);
movie.year = [NSDate date];
(3)、将数据添加到上下文上
[ctx insertObject:movie];
(4)、将数据保存到数据库
BOOL isSuccess= [ctx save:nil];
if (isSuccess) {
NSLog(@"保存成功");
}
9、更新数据
(1)、创建请求对象
(2)、更新数据
(3)、查询数据,返回数组
(4)、遍历数组
(5)、保存到数据库
10、删除数据
(1)、通过谓词设置过滤的条件
(2)、查询,返回数组
(3)、遍历数组,删除数据
(4)、保存到数据库,返回布尔
七、多表关联
1、添加属性Attributes
2、关联两个表Relation
3、创model,需独立创建,一起创建的话会使用父类创建关联属性
4、
}
==================================================================================================================================================
{
25、表视图
一、基础步骤
1、创建 (平铺和分组样式,区别在平铺的头视图会浮在顶部,分组不会)
UITableView *_tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 375, 667) style:UITableViewStylePlain];
2、设置代理,签订协议
_tableView.dataSource = self; 数据源代理
_tableView.delegate = self; 常用代理
3、加载数据
4、注册单元格
A、使用类方法注册
[_tableView registerClass:[MyCell class] forCellReuseIdentifier:cellID]; //代码创建的单元格
B、从xib文件中注册,注意:必须在xib文件中指定cell的复用标识符
[_listView registerNib:[UINib nibWithNibName:@"HomeTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:CellID]; //xib创建的单元格
5、实现代理方法(必须:单元格个数,创建单元格)
二、属性
1、头视图 tableHeaderView
2、尾视图 tableFooterView
3、背景视图 backgroundView
4、设置分割线(显示或隐藏) separatorStyle
5、分割线颜色 separatorColor
6、所有单元格的高度 rowHeight
7、头部行高 sectionHeaderHeight
8、尾部行高 sectionFooterHeight
9、允许多操作,删除按钮 allowsMultipleSelection
10、允许多选中单元格allowsMultipleSelectionDuringEditing
11、允许编辑,才能多选活删除 editing = yes;
下拉刷新控件
//下拉刷新控件UIRefreshControl*refresh = [[UIRefreshControlalloc]init];
[refresh
addTarget:selfaction:@selector(updateData)forControlEvents:UIControlEventValueChanged];
_songListTableView.refreshControl= refresh;
// 停止刷新
[_songListTableView.refreshControlendRefreshing];
12、隐藏表视图多余的单元格线条
_mainTableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero];
三、方法
1、获取指定 indexPath 单元格
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:5 inSection:0];
UITableViewCell *tableViewCell = [_tableView cellForRowAtIndexPath:indexPath];
2、获取当前屏幕所有可见单元格
NSArray *cellsArr = [_tableView visibleCells];
for (UITableViewCell *cell in cellsArr)
3、获取当前显示单元格的 indexPath
NSArray *indexPaths = [_tableView indexPathsForVisibleRows];
4、滑动到指定单元格(枚举指定单元格显示在顶部、中部、底部)
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:15 inSection:0];
[_tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
5、刷新表视图,重新走一遍数据源方法
[_tableView reloadData];
6、插入数据
[_tableView insterRowsAt]
7、设置分割线的留空、长度(self就是单元格cell)
[self setSeparatorInset:UIEdgeInsetsMake(0, 0, 0, 15)];
8、设置头视图的分割线,本来想隐藏的,但是找不到方法,只好用如下挫技
[selfsetSeparatorInset:UIEdgeInsetsMake(0,600,0,0)];
[cellsetSeparatorInset:UIEdgeInsetsMake(0,0,0,0)];
四、代理方法
1、单元格个数(必须)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
2、返回单元格(有多少单元格就调用多少次)
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
3、设置对应单元格高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath;
4、指定组头视图的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section;
5、指定组尾视图的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section;
6、选中单元格时调用此方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
7、即将显示单元格
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;
8、结束显示单元格
- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath NS_AVAILABLE_IOS(6_0);
9、返回头视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section;
10、返回尾视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section;
11、设置组头视图的title
- (NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section {
returntitle
}
五、单元格(在创建单元格协议方法中实现)
1、创建系统提供的单元格(单元格样式、重用标志符)
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"CYC666"];
UITableViewCellStyleDefault, // 左边图片 标题
UITableViewCellStyleValue1, // 左边图片 标题 详情(右边)
UITableViewCellStyleValue2, // 标题 详情(左边)
UITableViewCellStyleSubtitle // 左边图片 标题 详情(via边)
2、单元格内容视图 [cell.contentView addSubview:view];
3、选中时的视图 selectedBackgroundView
4、选中样式
cell.selectionStyle = UITableViewCellSelectionStyleBlue;
UITableViewCellSelectionStyleNone, //选中无反应 使用在消息列表
UITableViewCellSelectionStyleBlue,
UITableViewCellSelectionStyleGray,
UITableViewCellSelectionStyleDefault NS_ENUM_AVAILABLE_IOS(7_0)
5、辅助视图
cell.accessoryType = UITableViewCellAccessoryDetailButton;
UITableViewCellAccessoryNone, //无
UITableViewCellAccessoryDisclosureIndicator, //向右的剪头
UITableViewCellAccessoryDetailDisclosureButton, //详情 + 剪头
UITableViewCellAccessoryCheckmark, //打勾
UITableViewCellAccessoryDetailButton //详情
6、自定义辅助视图 accessoryview
cell.accessoryType = UITableViewCellAccessoryCheckmark; //打勾
7、用子类创建单元格
MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellID];
8、从 XIB 文件中导入单元格;注意:需要设置单元格的重用标识符
cell = [[[NSBundle mainBundle]loadNibNamed:@"MyCellView" owner:self options:nil] firstObject];
9、从xib加载的单元格,应该复写- (void)layoutSubviews;
10、单元格编辑的动作,可以发通知到表视图,reloaddata
11、根据cell相对tableview的frame,计算出cell相对屏幕的frame
//这里的y是相对于内容的起点,并不是相对于屏幕
CGRectframe = [selfcellForRowAtIndexPath:[NSIndexPathindexPathForRow:indexpathRowinSection:0]].frame;
//获取相对屏幕的frame(应该使用view的bounds,而不是frame)
CGRectrect = [selfconvertRect:boundstoView:self.superview];
[viewBconvertRect:viewC.frametoView:viewA];
该例子中显然viewA是目标,viewC是被操作的对象,那么剩下的viewB自然而然就是源了。作用就是计算viewB上的viewC相对于viewA的frame。
12、刷新某个单元格
[weakSelf.tableViewbeginUpdates];
[weakSelf.
dataSourceinsertObject:[NSDatedate]atIndex:0];
[weakSelf.
tableViewinsertRowsAtIndexPaths:@[[NSIndexPathindexPathForRow:0inSection:0]]withRowAnimation:UITableViewRowAnimationBottom];
[weakSelf.tableViewendUpdates];
六、表视图的编辑模式
1、将表视图设置为可编辑模式,设置之后单元格可以选中多个
[_tableView setEditing:YES animated:YES];
2、当表视图在编辑模式时,会调用以下方法
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
//插入模式
if (editingStyle == UITableViewCellEditingStyleInsert) {
[_data insertObject:@"程红梅" atIndex:indexPath.row];
NSIndexPath *indexPathNew = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section];
[_tableView insertRowsAtIndexPaths:@[indexPathNew] withRowAnimation:UITableViewRowAnimationMiddle];
}
//删除模式
else if (editingStyle == UITableViewCellEditingStyleDelete) {
[_data removeObjectAtIndex:indexPath.row];
[_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationMiddle];
}
}
设置单元格编辑模式的样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
/*
UITableViewCellEditingStyleNone,
UITableViewCellEditingStyleDelete,
UITableViewCellEditingStyleInsert
*/
if (indexPath.row == 0) {
//当既可以删除又可以插入,可选择
return UITableViewCellEditingStyleDelete;
//return UITableViewCellEditingStyleNone;
}else if (indexPath.row == 1){
return UITableViewCellEditingStyleInsert;
}else{
return UITableViewCellEditingStyleInsert | UITableViewCellEditingStyleDelete;
}
}
3、单元格的移动
//设置单元格允许移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath {
//1、取出单元格
id moveData = [_data objectAtIndex:sourceIndexPath.row];
//2、删除对应位置数据
[_data removeObjectAtIndex:sourceIndexPath.row];
//3、把取出的数据插到新位置
[_data insertObject:moveData atIndex:destinationIndexPath.row];
}
4、删除单元格
- (void)deleteAction:(UIBarButtonItem *)buttonItem{
//如果想删单元格,首先把数据中对应的单元格数据删掉,这样才能继续删单元格
NSArray *deleArray = _tableView.indexPathsForSelectedRows;
NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
for (NSIndexPath *indexPath in deleArray) {
[indexSet addIndex:indexPath.row];
}
[_data removeObjectsAtIndexes:indexSet];
//删除选中的单元格
[_tableView deleteRowsAtIndexPaths:deleArray withRowAnimation:UITableViewRowAnimationFade];
}
七、刷新单元格
1、点击单元格事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath;
2、刷新点击的单元格
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
八、刷新控件
1、创建
_refreshControl = [[UIRefreshControl alloc] init];
2、设置刚开始拉的文字提示
_refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"下拉刷新"];
3、添加响应
[_refreshControl addTarget:self action:@selector(refreshAction:) forControlEvents:UIControlEventValueChanged];
4、正在刷新的标题
if (refresh.refreshing) {
refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"加载中..."];
[refresh beginRefreshing];
}
5、停止刷新
[_refreshControl endRefreshing];
九、表视图控制器 UITableViewController
1、新建的表视图控制器默认为0组0列,而且创建单元格还没实现
2、
}
左划显示删除按钮
#pragma mark - 允许编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
return YES;
}
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath {
return @"不再显示";
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
}
==================================================================================================================================================
{
26、UICollectionView 集合视图(是滑动视图的子类)
一、基本流程
1、创建布局对象
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
2、根据布局对象创建集合视图
UICollectionView *collectionView = [[UICollectionView alloc] initWithFrame:CGRectMake(0, 20, 375, 647) collectionViewLayout:flowLayout];
3、设置代理,签订协议
collectionView.dataSource = self;
collectionView.delegate = self;
4、实现代理方法
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section;
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;
二、布局对象属性
1、单元格大小
flowLayout.itemSize = CGSizeMake(100, 100);
2、布局方向(滑动方向)
flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
3、水平、垂直方向间距
flowLayout.minimumInteritemSpacing = 50;
flowLayout.minimumLineSpacing = 40;
4、顶部预留大小
flowLayout.headerReferenceSize = CGSizeMake(0, 100);
5、底部预留大小
flowLayout.footerReferenceSize = CGSizeMake(0, 50);
三、集合视图属性
1、背景视图,固定的,不会跟着滑动 backgroundView
2、定义成可滑动的背景视图 (图片拼接的背景)
collectionView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"BookShelfCell@2x"]];
3、是否允许点击响应(默认YES)
collectionView.allowsSelection = NO;
4、是否允许多个响应(默认NO)
collectionView.allowsMultipleSelection = YES;
四、集合视图代理方法
1、单元格大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath;
2、留白,感觉没啥用
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
3、点击单元格响应
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath;
}
//这个不是必须的方法是Cell将要显示
- (
void)collectionView:(UICollectionView*)collectionView willDisplayCell:(UICollectionViewCell*)cell forItemAtIndexPath:(NSIndexPath*)indexPath {
cell.
layer.transform=CATransform3DMakeScale(0.3,0.3,1);//缩放比例
[
UIViewanimateWithDuration:0.8animations:^{
cell.
layer.transform=CATransform3DMakeScale(1,1,1);//还原为1
}];
}
==================================================================================================================================================
{
27、视图控制器的侧滑 MMDrawController
1、导入第三方框架文件夹MMDrawController
2、创建中间控制器、左边控制器、邮编控制器
CYCTBController *tabBarController = [[CYCTBController alloc] init];
LeftViewController *left = [[LeftViewController alloc] init];
RightViewController *right = [[RightViewController alloc] init];
3、使用第三方类创建侧滑控制器,并指定中左右控制器,可以只实现单边侧滑
MMDrawerController *mmvc = [[MMDrawerController alloc] initWithCenterViewController:tabBarController
leftDrawerViewController:left
rightDrawerViewController:right];
4、设置侧滑控制器的属性
(1)、左右控制器窗口的宽度
mmvc.maximumLeftDrawerWidth = 150;
mmvc.maximumRightDrawerWidth = 200;
(2)、是否有阴影,阴影颜色、大小、偏移量、不透明度
mmvc.showsShadow = YES;
mmvc.shadowColor = [UIColor lightGrayColor];
mmvc.shadowRadius = 50;
mmvc.shadowOffset = CGSizeMake(20, 20);
mmvc.shadowOpacity = .9;
(3)、打开、关闭侧边栏方式(必须设置)
mmvc.openDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
mmvc.closeDrawerGestureModeMask = MMOpenDrawerGestureModeAll;
(4)、是否允许侧边栏窗口被拉伸
mmvc.shouldStretchDrawer = YES;
(5)、侧边拉开后,中间窗口允许怎样的操作(不允许操作、允许控制导航栏、允许所有)
mmvc.centerHiddenInteractionMode = MMDrawerOpenCenterInteractionModeFull;
(6)、背景视图的颜色
mmvc.statusBarViewBackgroundColor = [UIColor lightGrayColor];
(7)、状态栏是否显示在背景视图
mmvc.showsStatusBarBackgroundView = YES;
5、将侧滑控制器设置为appdelegate的跟控制器
self.window.rootViewController = mmvc;
6、设置标签控制器下的某个子控制器不支持侧滑
(1)、视图将要出现的时候,禁用MMDrawCtrls
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:YES];
//获取根视图控制器
MMDrawerController *drawCtrl= (MMDrawerController *)[UIApplication sharedApplication].keyWindow.rootViewController;
//设置一下打开的区域
[drawCtrl setOpenDrawerGestureModeMask:MMOpenDrawerGestureModeNone];
}
(2)、视图将要消失的时候,还原一下
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
MMDrawerController *drawCtrl= (MMDrawerController *)[UIApplication sharedApplication].keyWindow.rootViewController;
//设置一下打开的区域
[drawCtrl setOpenDrawerGestureModeMask:MMOpenDrawerGestureModeAll];
}
}
==================================================================================================================================================
{
28、超文本链接
1、创建UITextView,因为它可以多行输入,可以接受触摸事件
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(40, 35.5, 300, 400)];
2、关闭textView的可编辑属性,就可以响应点击事件
textView.editable = NO;
3、设置代理,签订协议
textView.delegate = self;
4、创建属性文本
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:context];
5、设置超链接
[attribute addAttribute:NSLinkAttributeName value:@"www.baidu.com" range:[context rangeOfString:@"钟文佳"]];
6、超链接颜色
textView.linkTextAttributes = @{NSForegroundColorAttributeName : [UIColor blueColor]};
7、显示文字
textView.attributedText = attribute;
8、实现代理方法,监听超链接的点击事件,一旦点击了超链接,就会调用此协议方法
- (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange {
NSLog(@"%@", URL.absoluteString);
return YES;
}
}
==================================================================================================================================================
{
29、Foundation框架
一、NSObject的常用方法
1、调用某个方法,最多携带两个参数
- (id)performSelector:(SEL)aSelector;
- (id)performSelector:(SEL)aSelector withObject:(id)object;
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
2、判断两个对象是否相同
- (BOOL)isEqual:(id)object;
3、判断该对象是否属于本类
- (BOOL)isKindOfClass:(Class)aClass; (本类或父类)
- (BOOL)isMemberOfClass:(Class)aClass; (本类)
4、判断该对象是否签订了本协议
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
5、将对象拷贝成可变对象(前提是有可变子类)
- (id)mutableCopy;
6、使用alloc-init创建对象时,会调用以下方法
+ (id)copyWithZone:(struct _NSZone *)zone
7、判断该类是否是本类的子类
+ (BOOL)isSubclassOfClass:(Class)aClass;
8、延迟调用某个方法(相当于挂起,可以取消调用)
[self performSelector:@selector(eatMeal:) withObject:@"3" afterDelay:3];
9、取消调用某个方法
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(eatMeal:) object:@"3"];
二、NSString
1、长度属性
.length
2、字符的位置
- (unichar)characterAtIndex:(NSUInteger)index;
3、截取字符串(从哪开始、从哪结束、截取哪个区间)
- (NSString *)substringFromIndex:(NSUInteger)from;
- (NSString *)substringToIndex:(NSUInteger)to;
- (NSString *)substringWithRange:(NSRange)range;
4、判断两个字符串是否相等
- (BOOL)isEqualToString:(NSString *)aString;
5、是否包含字符串
- (BOOL)hasPrefix:(NSString *)str;
6、寻找字符串1在字符串2中的位置(可选:往前往后查找?在哪个区间查找?)
- (NSRange)rangeOfString:(NSString *)searchString options:(NSStringCompareOptions)mask range:(NSRange)searchRange;
if (r.location != NSNotFound) {
NSLog(@"找到要找的字符串啦,位置起点是%ld,数据长度为%ld", r.location, r.length);
}
7、追加字符串(拼接)
- (NSString *)stringByAppendingFormat:(NSString *)format;
8、转换成基本类型(方法)
doubleValue、floatValue、intValue、integerValue、longLongValue、boolValue
9、比较大小
NSComparisonResult com78 = [str7 compare:str8];
if (com78 == NSOrderedAscending) {
NSLog(@"升序 a < b");
}
10、字符串转换(全大写、全小写、首字母大写)
[str10 uppercaseString];
[str10 lowercaseString];
[str10 capitalizedString];
11、分割字符串,结果返回数组
NSArray *arr = [str16 componentsSeparatedByString:@"-"];
12、用特定字符将字符串数组拼接成字符串
NSString *str5 = [arr1 componentsJoinedByString:@"+"];
13、修改字符串对应字符的内容
NSString *str21 = [str19 stringByReplacingOccurrencesOfString:@"126.com" withString:@"163.com"];
14、读取文档中的字符串
+ (nullable instancetype)stringWithContentsOfURL:(NSURL *)url encoding:(NSStringEncoding)enc error:(NSError **)error;
三、NSMutableString
1、在指定位置插入字符串
- (void)insertString:(NSString *)aString atIndex:(NSUInteger)loc;
2、删除指定区间的字符串
- (void)deleteCharactersInRange:(NSRange)range;
3、追加字符串
- (void)appendString:(NSString *)aString;
- (void)appendFormat:(NSString *)format, ... NS_FORMAT_FUNCTION(1,2);
4、创建可变字符串时,指定大小,但是仍然可变
- (NSMutableString *)initWithCapacity:(NSUInteger)capacity;
四、NSArray
1、用字符串将数组链接起来
- (NSString *)componentsJoinedByString:(NSString *)separator;
2、判断两个数组是否一致
- (BOOL)isEqualToArray:(NSArray *)otherArray;
3、元素的index
- (NSUInteger)indexOfObject:(ObjectType)anObject;
4、最后一个元素、第一个元素(当没有元素时,返回nil,如果用index=0获取第一个元素,当没有元素的时候,会出错)
lastObject、firstObject
5、block遍历数组
[marr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSLog(@"%@", obj) ;
}];
6、修改两index的元素
- (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;
7、删除所有元素
- (void)removeAllObjects;
8、插入元素
- (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes;
9、删除指定index的元素
- (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;
10、替换元素
- (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects;
11、分割数组
[array subarrayWithRange:range];
五、NSMutableArray
1、创建的时候指定元素个数
+ (instancetype)arrayWithCapacity:(NSUInteger)numItems;
六、NSSet
1、元素个数
count
2、是否包含某元素
- (BOOL)containsObject:(ObjectType)anObject;
3、转成数组
NSArray *array1 = [set1 allObjects];
4、随机取出元素
NSString *str1 = [set1 anyObject];
七、NSDictionary
1、元素个数
count
2、根据key取出value
- (nullable ObjectType)objectForKey:(KeyType)aKey;
3、所有key、value(属性)
allKeys、allValues
4、删除键值对
- (void)removeObjectForKey:(KeyType)aKey;
5、删除所有
- (void)removeAllObjects;
6、根据key数组删除value
- (void)removeObjectsForKeys:(NSArray *)keyArray;
八、可变字典
九、NSDate
1、将日期类分割年月日时分秒六个元素,存到数组中
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy:MM:dd:HH:mm:ss"];
NSString *dateString = [formatter stringFromDate:date];
_timerArray = [dateString componentsSeparatedByString:@":"];
// 格式化时间 16-11-20 20:30:12 PM
NSDateFormatter* formatter = [[NSDateFormatteralloc]init];
[formatter
setAMSymbol:@"AM"];
[formatter
setPMSymbol:@"PM"];
[formatter
setDateFormat:@"YY-MM-dd hh:mm:ss aaa"];
NSString* currentDate = [formatterstringFromDate:[NSDatedate]];
NSLog(@"%@",currentDate);
例子
//时间戳转换时间NSDate*confromTimesp = [NSDatedateWithTimeIntervalSince1970:[_personSeeModelLayout.personSeeModel.create_timeintegerValue]];
NSDateFormatter*formatter = [[NSDateFormatteralloc]init];
[formatter
setDateStyle:NSDateFormatterMediumStyle];
[formatter
setTimeStyle:NSDateFormatterShortStyle];
[formatter
setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
NSString*confromTimespStr = [formatterstringFromDate:confromTimesp];
当前时间戳
CFAbsoluteTimeStopTime =CFAbsoluteTimeGetCurrent();
NSLog(@"%f --- %f", StartTime, StopTime);
测试两个节点之间的时间差
节点一:NSDate*oldDate = [NSDatedate];
节点二:doublecurrentTime = [[NSDatedate]timeIntervalSinceDate:oldDate];
NSLog(@"%f", currentTime);
}
==================================================================================================================================================
{
31、GPS和地图
一、GPS
1、配置plist文件设置GPS定位允许
NSLocationAlwaysUsageDescription 应用程序可以一直使用定位
NSLocationWhenInUseUsageDescription 应用程序使用的时候再去定位
2、导入location框架
#import
3、创建location管理者
CLLocationManager *_manager = [[CLLocationManager alloc]init];
4、根据版本号请求用户授权定位
if (kiOSLater >=8.0) {
[_manager requestWhenInUseAuthorization];
}
5、设置定位精度
_manager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
6.设置代理,签订协议
_manager.delegate= self;
CLLocationManagerDelegate
7.开始定位
[_manager startUpdatingLocation];
8、定位成功后调用的协议方法
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
//停止定位
[_manager stopUpdatingLocation];
//取出定位对象
CLLocation *location = [locations lastObject];
//取出经纬度
float lat= location.coordinate.latitude;
float lon = location.coordinate.longitude;
//将经纬度转换成字符串
NSString *latStr = [NSString stringWithFormat:@"%f",lat];
NSString *longStr = [NSString stringWithFormat:@"%f",lon];
//根据经纬度发送网络请求(位置反编码)
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
[appDelegate.sinaweibo requestWithURL:@"place/nearby/pois.json" params:[@{@"lat" :latStr,@"long" :longStr}mutableCopy] httpMethod:@"GET" delegate:self];
}
9、接收网络请求回来的地理位置,解析数据
二、地图
1、导入框架
#import
#import
//版本号
#define kiOSLater [[UIDevice currentDevice].systemVersion floatValue]
2、根据版本号请求用户授权定位,创建全局的位置管理者
if (kiOSLater >=8.0) {
_location = [[CLLocationManager alloc]init];
[_manager requestWhenInUseAuthorization];
}
3、创建地图
MKMapView *mapView = [[MKMapView alloc]initWithFrame:self.view.bounds];
4、显示地图
[self.view addSubview:mapView];
5、设置代理,签订协议
mapView.delegate = self;
6、显示当前用户的当前位置(回去定位)
mapView.showsUserLocation = YES;
7、代理方法:用户的位置已经更新(定位成功了)
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{
//区域
CLLocationCoordinate2D coordinate = userLocation.coordinate;
//跨度 ,传入的参数值越小,越精确
MKCoordinateSpan span = MKCoordinateSpanMake(.05, .05);
//设置显示的区域(跨度)
[mapView setRegion:MKCoordinateRegionMake(coordinate, span)];
//添加大头针MKPointAnnotation*annotation = [[MKPointAnnotationalloc]init];
[annotation
setCoordinate:CLLocationCoordinate2DMake(_lat,_lon)];
[annotation
setTitle:_placeName];
[mapView
addAnnotation:annotation];
8、选中了大头针
- (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view;
9、取消选中了大头针
- (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view;
10、添加了大头针后执行该下方法
- (nullable MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id )annotation;
}
==================================================================================================================================================
{
32、MBProhressHUD 风火轮、活动监视,详解看自带Demo
1、导入第三方框架
#import "MBProgressHUD.h"
2、创建,并指定显示的位置
MBProgressHUD *hud = [MBProgressHUD showHUDAddedTo:[UIApplication sharedApplication].keyWindow animated:YES];
3、设置显示的内容
hud.customView = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]];
4、视图上面显示的文字
hud.labelText = @"发送成功";
5、设置自定义视图的模式(最主要的)
hud.mode = MBProgressHUDModeCustomView;
6、隐藏
[hud hide:YES afterDelay:1];
}
==================================================================================================================================================
{
33、富文本专辑
一、属性文本 富文本
(1)、创建属性文本
NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:。。。。。];
(2)、给某一区间的文字添加属性
[attribute addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:NSMakeRange(8, 12)];
[attribute addAttributes:<#(nonnull NSDictionary *)#> range:<#(NSRange)#>]
(3)、给文本标签设置属性文本
label.attributedText = attribute;
(4)、常见文本属性
NSFontAttributeName 设置字体属性,默认值:字体:Helvetica(Neue) 字号:12
NSForegroundColorAttributeName 设置字体颜色,取值为 UIColor对象,默认值为黑色
NSBackgroundColorAttributeName 设置字体所在区域背景颜色,取值为 UIColor对象,默认值为nil, 透明色
NSLigatureAttributeName 设置连体属性,取值为NSNumber 对象(整数),0 表示没有连体字符,1 表示使用默认的连体字符
NSKernAttributeName 设定字符间距,取值为 NSNumber 对象(整数),正值间距加宽,负值间距变窄
NSStrikethroughStyleAttributeName 设置删除线,取值为 NSNumber 对象(整数)
NSStrikethroughColorAttributeName 设置删除线颜色,取值为 UIColor 对象,默认值为黑色
NSUnderlineStyleAttributeName 设置下划线,取值为 NSNumber 对象(整数),枚举常量 NSUnderlineStyle中的值,与删除线类似
NSUnderlineColorAttributeName 设置下划线颜色,取值为 UIColor 对象,默认值为黑色
NSStrokeWidthAttributeName 设置笔画宽度,取值为 NSNumber 对象(整数),负值填充效果,正值中空效果
NSStrokeColorAttributeName 填充部分颜色,不是字体颜色,取值为 UIColor 对象
NSShadowAttributeName 设置阴影属性,取值为 NSShadow 对象
NSTextEffectAttributeName 设置文本特殊效果,取值为 NSString 对象,目前只有图版印刷效果可用:
NSBaselineOffsetAttributeName 设置基线偏移值,取值为 NSNumber (float),正值上偏,负值下偏
NSObliquenessAttributeName 设置字形倾斜度,取值为 NSNumber (float),正值右倾,负值左倾
NSExpansionAttributeName 设置文本横向拉伸属性,取值为 NSNumber (float),正值横向拉伸文本,负值横向压缩文本
NSWritingDirectionAttributeName 设置文字书写方向,从左向右书写或者从右向左书写
NSVerticalGlyphFormAttributeName 设置文字排版方向,取值为 NSNumber 对象(整数),0 表示横排文本,1 表示竖排文本
NSLinkAttributeName 设置链接属性,点击后调用浏览器打开指定URL地址
NSAttachmentAttributeName 设置文本附件,取值为NSTextAttachment对象,常用于文字图片混排
NSParagraphStyleAttributeName 设置文本段落排版格式,取值为 NSParagraphStyle 对象
(5)、删除属性文本
- (void)removeAttribute:(NSString *)name range:(NSRange)range;
二、NSMutableParagraphStyle 段落样式
1、设置行间距
(1)、创建富文本
NSMutableAttributedString *string = [[NSMutableAttributedString alloc] initWithString:SSSS];
(2)、创建段落样式
NSMutableParagraphStyle *paragrah = [[NSMutableParagraphStyle alloc] init];
(3)、设置段落的行间距
paragrah.lineSpacing = 40;
(4)、设置要改变行间距的文本内容
NSRange range = NSMakeRange(0, string.length);
(5)、修改富文本
[string addAttribute:NSParagraphStyleAttributeName value:paragrah range:range];
2、其他属性
段落间距 paragraphSpacing
不知为何物 paragraphSpacingBefore
对其方式 alignment
首行缩进 firstLineHeadIndent
左边缩进 headIndent
右边缩进 tailIndent(注意:是以左边为标准)
换行方式 lineBreakMode
最小行高 minimumLineHeight
最大行高 maximumLineHeight
修改的标准 baseWritingDirection
行高倍数 lineHeightMultiple
默认的tab间距 defaultTabInterval
三、图文混排
1、创建附件,可以显示图片
NSTextAttachment * attach= [[NSTextAttachment alloc]init];
2、给附件设置图片
attach.image = [UIImage imageNamed:@"007.png"];
attach.bounds = CGRectMake(4, 10, 10, 10); //图文内容的位置偏移和大小
3、根据附件生成另外一个属性文本
NSAttributedString *att = [NSAttributedString attributedStringWithAttachment:attach];
4、根据字符串创建可变属性文本
NSMutableAttributedString *mutableAtt = [[NSMutableAttributedString alloc]initWithString:context];
5、将携带图片的属性文本插入到可变属性文本上
[mutableAtt insertAttributedString:att atIndex:5];
6、给textView视图设置可变属性文本
textView.attributedText = mutableAtt;
按钮富文本左对齐
locationButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
}
==================================================================================================================================================