IOS实训周报-1:UI编程、本地存储和网络编程
本周实训学习内容
UI编程
UI元素是我们应用程序里可以看见的任何可视元素,其中一些元素响应用户的操作,如按钮、文本字段,有其他的丰富内容,如图像、标签等。
在应用程序中编辑UI控件主要通过界面生成器和代码两种方法。
通过使用界面生成器拖放UI控件,可以简单快速添加UI控件;而通过代码添加UI控件则需通过:添加自定义方法 addXXX 在 ViewController.m 中更新 viewDidLoad等更繁琐的过程。
常用UI控件
-
UILabel:标签用于显示静态内容,包括单独的一行或多行。
-
UIImangView:图像视图用于显示一个简单的图像序列。
-
UIButton:按钮用于处理用户操作。
-
UISwitch:开关用作禁用和启用操作。
-
UITextField:文本字段是用户界面元素,使用应用程序来获取用户输入。
-
UITextView:文本视图用于显示滚动列表的文本信息可以被选中和编辑
-
UITableView: 列表控件(表格视图)由单元格 (一般可重复使用)
组成,用于显示垂直滚动的视图,广泛应用于App的各个界面。常用的功能有TableView创建、更新、编辑与TableViewCell样式编辑、自定义、插入、移动、重用等
(使用方法与具体代码实例 )
IOS绘图
IOS绘图主要有以下五个框架:
-
UIKit(最常用)
-
CoreGraphics
-
CoreAnimation
-
CoreImage
-
OpenGL-ES
其中UIKit框架提供的UIView是所有视图控件的基类,绘制方式主要有:视图叠加,设置透明度/边框/背景颜色,在drawRect(由系统回调,主动调用无效)实现绘制代码等。
关于课件推荐的 UIBezierPath:UIBezierPath这个类在UIKit中, 是Core
Graphics框架关于path的一个封装,使用此类可以定义简单的形状,如常用的矩形、圆形、椭圆、弧、不规则的多边形等。
创建和使用path对象步骤:
-
重写View的drawRect方法
-
创建UIBezierPath的对象
-
使用方法moveToPoint: 设置初始点
-
根据具体要求使用UIBezierPath类方法绘图
-
设置UIBezierPath对象相关属性(比如lineWidth、lineJoinStyle、aPath.lineCapStyle、color)
-
使用stroke 或者 fill方法结束绘图
ViewController
ViewController是iOS应用程序中重要的部分,是应用程序数据和视图之间的重要桥梁。ViewController管理应用中的众多视图。
-
展示型ViewController:主要用于为用户展示内容,并与用户交互,如UITableViewController,UIViewController。
-
容器型ViewController:用于控制和显示其他ViewController,如UINavigationController, UITabbarController。它们都有一个属性:viewControllers。
其中UINavigationController表示一种Stack式结构,push一个ViewController或pop一次,因此后一个ViewController一般会依赖前一个ViewController。
(详细教程)
本地存储
IOS沙盒机制
(来源与详细教程:沙盒机制整合 沙盒目录结构 文件读/写及管理 NSUserDefaults )
-
概念:每个iOS应用都有自己的应用沙盒,应用沙盒就是文件系统目录。
-
核心:sandbox对应用程序执行各种操作的权限限制
-
特点:
- 每个应用程序的活动范围都限定在自己的沙盒里;
- 不能随意跨越自己的沙盒去访问别的应用程序沙盒中的内容;
- 在访问别人沙盒内的数据时需要访问权限。
-
概括:
- 是一种安全体系的表现。
- 总体来说沙盒就是一种独立、安全、封闭的空间。
- 非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。
* APP之间不能相互通,唯独可以通过URL Scheme可以通信
文件目录获取及读写管理
获取各种文件目录路径:
// 获取沙盒主目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// 获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
// 获取Caches目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 获取tmp目录路径
NSString *tmpDir = NSTemporaryDirectory();
文件读写方法(以字符串为例):
// 字符串写入沙盒
// 在Documents下面创建一个文本路径,假设文本名称为objc.txt
NSString *txtPath = [docPath stringByAppendingPathComponent:@"objc.txt"]; // 此时仅存在路径,文件并没有真实存在
NSString *string = @"Objective-C";
// 字符串写入时执行的方法
[string writeToFile:txtPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"txtPath is %@", txtPath);
// 字符串读取的方法
NSString *resultStr = [NSString stringWithContentsOfFile:txtPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"resultStr is %@", resultStr);
文件管理器可以对文件进行操作(创建、删除、改名等)以及文件信息的获取
- 创建文件夹
// 创建文件管理对象
NSFileManager *fileManager = [NSFileManager defaultManager];
// 创建文件夹
[fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@"%@", dirPath);
- 创建文件
// 创建一个文件路径
NSString *filePath = [docPath stringByAppendingPathComponent:@"objc.txt"];
// 创建文件首先需要一个文件管理对象
NSFileManager *fileManager = [NSFileManager defaultManager];
// 创建文件
[fileManager createFileAtPath:filePath contents:[@"Objective-C" dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
NSLog(@"%@",filePath);
// 获取某个文件或者某个文件夹的大小
NSDictionary *dic = [fileManager attributesOfItemAtPath:filePath error:nil];
NSLog(@"%@", dic);
NSNumber *number = [dic objectForKey:NSFileSize];
NSInteger size = number.intValue;
NSLog(@"%@", number);
- 文件移动
// 创建文件管理器对象,进行文件移动操作
NSFileManager *fileManager = [NSFileManager defaultManager];
// 移动文件
[fileManager moveItemAtPath:path toPath:desPath error:nil]; // 移动文件的核心代码
NSUserDefaults
NSUserDefaults是iOS系统提供的一个单例类(iOS提供了若干个单例类),通过类方法standardUserDefaults可以获取NSUserDefaults单例。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSUserDefaults单例以key-value的形式存储了一系列偏好设置,key是名称,value是相应的数据。存/取数据时可以使用方法objectForKey:和setObject:forKey:来把对象存储到相应的plist文件中,或者读取。
网络编程
重要概念:
-
客户端(Client):移动应用(iOS、android等应用)。
-
服务器(Server):为客户端提供服务、提供数据、提供资源的机器。
-
请求(Request):客户端向服务器索取数据的一种行为。
-
响应(Response):服务器对客户端的请求做出的反应,一般指返回数据给客户端。
HTTP基础
HTTP协议是在网络开发中最常用的协议,一次HTTP操作称为一个事务,其工作过程可分为四步:
-
客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。
-
建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
-
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
-
客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
(HTTP协议 )
NSURLSession
苹果官方提供的网络请求API有两种: NSURLConnection、NSURLSession。
-
NSURLSession 是在iOS 7发布时用于替代NSURLConncetion的
-
iOS 9之后,苹果放弃更新NSURLConnection
-
推荐使用NSURLSession
使用NSURLSession发送 GET 请求的方法:
- 确定请求路径(一般由公司的后台开发人员以接口文档的方式提供),GET请求参数直接跟在URL后面;
- 创建请求对象(默认包含了请求头和请求方法【GET】),此步骤可以省略;
- 创建会话对象(NSURLSession);
- 根据会话对象创建请求任务(NSURLSessionDataTask);
- 执行Task;
- 当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)。
使用NSURLSession发送 POST 请求的方法:
- 确定请求路径(一般由公司的后台开发人员以接口文档的方式提供);
- 创建可变的请求对象(因为需要修改),此步骤不可以省略;
- 修改请求方法为POST;
- 设置请求体,把参数转换为二进制数据并设置请求体;
- 创建会话对象(NSURLSession);
- 根据会话对象创建请求任务(NSURLSessionDataTask);
- 执行Task;
- 当得到服务器返回的响应后,解析数据(XML|JSON|HTTP)。
Demo:
//NSURLSession
-(void)demo2{
//访问百度首页
//1. 创建一个网络请求
NSURL *url = [NSURL URLWithString:@"http://m.baidu.com"];
//2.创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//3.获得会话对象
NSURLSession *session=[NSURLSession sharedSession];
//4.根据会话对象创建一个Task(发送请求)
第一个参数:请求对象
第二个参数:completionHandler回调(请求完成【成功|失败】的回调)
data:响应体信息(期望的数据)
response:响应头信息,主要是对服务器端的描述
error:错误信息,如果请求失败,则error有值
*/
NSURLSessionDataTask *dataTask=[session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//response : 响应:服务器的响应
//data:二进制数据:服务器返回的数据。(就是我们想要的内容)
//error:链接错误的信息
NSLog(@"网络响应:response:%@",response);
//根据返回的二进制数据,生成字符串!NSUTF8StringEncoding:编码方式
NSString *html = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
//在客户端直接打开一个网页!
//客户端服务器:UIWebView
//将浏览器加载到view上
dispatch_async(dispatch_get_main_queue(), ^{
//实例化一个客户端浏览器
UIWebView *web = [[UIWebView alloc]initWithFrame:self.view.bounds];
//加载html字符串:baseURL:基准的地址:相对路径/绝对路径
[web loadHTMLString:html baseURL:nil];
[self.view addSubview:web];
});
// //在本地保存百度首页
// [data writeToFile:@"/Users/Liu/Desktop/baidu.html" atomically:YES];
}
];
//5.执行任务
[dataTask resume];
}
AFNetworking
AFNetworking:轻量级网络请求开源框架,封装了原生的方法,使用前需要导入AFN框架。
-
GET请求
-
POST请求
-
Download请求
-
Upload请求
-
网络状态检测