版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS开发实战全套可编辑PPT课件分13章,包括iOS开发准备、iOS基本开发流程、基础UI控件、高级UI控件、多线程编程、网络编程、多媒体和硬件、定位服务和地图应用、屏幕适配、数据持久化、动画技术、项目设置与发布、开发实践——上班签到App01第一章ios开发准备全套可编辑PPT课件iOS概述1.1iOS开发语言1.2搭建iOS开发环境1.3创建第一个iOS应用1.4iOS系统的架构层次1.5自从2010年6月7日苹果公司将其移动操作系统重新定名为“iOS”,并发布新一代操作系统——iOS4以来,每年都会进行一次重大更新。iOS4
iOS5
iOS6
iOS7开始支持多任务处理,新增FaceTime应用、文件夹管理等。新增通知中心、iMessage、iCloud、无线同步和Siri语音服务功能。开始用自家地图App取代谷歌地图,Siri支持中文。开始采用全新的扁平化设计风格,新增上滑控制中心。iOS8
iOS9
iOS10改善了Wi-Fi功能,新增ApplePay和健康应用。采用全新字体,密码增强至6位,搜索栏更方便,内置地图支持公交地铁查询,增强备忘录功能,iPad可分屏操作,优化后台应用显示,新增低电量模式和Wi-Fi助理功能。滑动解锁方式改为按Home键直接解锁,增加抬起唤醒屏幕功能,增加骚扰电话拦截功能,iMessage加入多种特效和表情包,Siri支持更多第三方功能,照片管理更智能,地图新增更多关联功能,新增“家庭”应用,时钟增加“就寝”功能,3DTouch功能得到增强,上滑控制中心一分为二,通知弹窗变为常驻横幅,可移除部分预装系统应用。iOS11主要具有以下几项重要更新:(1)iMessage重新设计应用抽屉,支持iCloud同步删除。(2)支持ApplePay对点转账,Siri图标更新且更加智能。(3)全新设计的控制中心,锁屏界面和通知中心合二为一。(4)LivePhotos支持编辑,地图服务支持机场室内地图。(5)全新设计的AppStore,更多彩色的卡片式设计。(6)相机支持扫码,短信防骚扰,手机号可作为AppleID。(7)新增文件管理器、屏幕录制功能和驾驶勿扰模式。(8)加入CoreML框架(机器学习)和ARKit框架(AR应用开发)。(9)不再支持32位应用程序,必须升级到64位。iOS概述1.1iOS开发语言1.2搭建iOS开发环境1.3创建第一个iOS应用1.4iOS系统的架构层次1.5目前,iOS应用开发主要采用两种编程语言:Objective-CSwift比较普及,但自身存在一些缺陷,如语法复杂等;语法简单,易学易用,正在逐渐取代Objective-C。Objective-C(简称ObjC或OC)是一种以SmallTalk-80语言为基础,并结合C语言特征而扩展出来的面向对象编程语言,它是开发苹果公司macOS和iOS等应用程序的主要编程语言之一。但从2015年12月开始,Objective-C正在逐步被Swift所取代。Swift结合了C和Objective-C的优点并且不受C兼容性的限制,采用安全的编程模式并且添加了很多新特性,一经推出,便立刻引起了全世界开发者的关注。在北京时间2014年6月3日举行的WWDC2014上,苹果公司推出了全新的开发语言——Swift,它可以与Objective-C共同运行于macOS和iOS系统,用于开发基于苹果平台的应用程序。为了方便开发者学习和降低开发应用程序的负担,苹果公司推出了Swift语言。Swift是第一种具有与脚本语言同样的表现力和趣味性的系统编程语言。它支持代码预览,这个革命性的特性可以允许开发者在不编译和不运行应用程序的前提下运行Swift代码并实时查看结果。Swift的设计以安全为出发点,以避免各种常见的编程错误,其语法和标准库也非常简洁,可让编程流程大大缩短、简化。北京时间2017年9月20日,苹果公司发布了Swift4.0正式版(集成于Xcode9中)它在Swift3的基础上,提供了更强大的稳健性和稳定性,为Swift3提供源码兼容性,对标准库进行改进,并添加了归档和序列化自定义类型等功能。Swift4.0的主要改进包括:54321添加Codable协议,方便自定义数据类型序列化;添加定义多行字符串语法;改进Key-ValueCoding的KeyPath;修改并强化字典功能;字符串变为集合类型。iOS概述1.1iOS开发语言1.2搭建iOS开发环境1.3创建第一个iOS应用1.4iOS系统的架构层次1.5在正式开始iOS应用开发之前,需要先搭建iOS开发环境,即安装Xcode。1.3.1Xcode简介Xcode是由苹果公司开发的运行于macOS中的集成开发环境(IntegratedDevelopmentEnvironment,IDE),可用来开发iOS,macOS,watchOS和tvOS应用程序。Xcode具有统一的用户界面设计,创建和调试源代码、编译应用程序、对应用程序进行性能调优等都可以在一个简单的窗口中完成。它同时支持Objective-C,C,C++和Swift等多种语言。Xcode集成了功能强大的界面设计器——InterfaceBuilder,借助它,用户可轻松地通过拖、拉、拽各种控件来设计窗体和视图。使用Xcode工具开发应用程序时,只需要选择应用程序对应的类型或者想要编写代码的部分,其模型和设计系统就会自动创建分类图表,帮助开发人员轻松定位并访问相应的代码片段。另外,Xcode工具还可以为开发人员的应用程序自动创建数据结构,开发人员无需编写任何代码,就可以自动撤销、保存应用程序。Xcode还提供了高级文档阅读工具,用于阅读和搜索帮助文档,这些文档可以是来自苹果公司网站的在线文件,也可以是存放在开发者本地电脑上的文件。在对Xcode有了基本了解之后,下面开始搭建iOS开发环境——安装Xcode9。在macOS操作系统中,安装Xcode9有两种方式:一种是通过MacAppStore进行在线安装;1另一种是通过从苹果开发者官网(/download/more/)下载镜像文件来安装。2具体的安装操作请参考书中描述。iOS概述1.1iOS开发语言1.2搭建iOS开发环境1.3创建第一个iOS应用1.4iOS系统的架构层次1.5打开Xcode9工具,可以看到其主界面如下图所示。该界面主要由菜单栏、工具栏、导航面板、详细编辑区和实用工具面板组成。编辑器顶部的跳转栏,用于快速查看各类界面元素菜单栏工具栏导航面板详细编辑区实用工具面板Xcode9主界面由一组菜单(Xcode、文件、编辑、视图、查找、导航、编辑器、产品、调试、版本控制、窗口、帮助)组成,几乎提供了Xcode的所有功能。菜单栏从左向右依次是窗口控制按钮(关闭、最小化和最大化)、项目运行控制按钮(运行和停止)、配置运行方案按钮、活动视图(显示项目当前的状态信息)、编辑器切换开关(打开或关闭标准编辑器、辅助编辑器、版本编辑器)、面板控制开关(隐藏或显示导航面板、调试区域〔位于详细编辑区的底部〕、实用工具面板)。工具栏其顶部共有9个按钮,用于切换至不同的导航面板,依次为项目导航面板、版本控制导航面板、符号导航面板、查找导航面板、问题导航面板、测试导航面板、调试导航面板、断点导航面板、日志导航面板。导航面板它是Xcode的主体区域,供开发者为应用程序设计界面和编写代码。详细编辑区用于管理项目中不同种类的对象,分为上、下两部分,上方是随环境变化的检查器面板(例如文件检查器、快速帮助检查器、标识检查器、属性检查器、尺寸检查器、连接检查器等),下方是各种库面板(包括文件模板库、代码片段库、对象库和媒体库等)。实用工具面板iOS概述1.1iOS开发语言1.2搭建iOS开发环境1.3创建第一个iOS应用1.4iOS系统的架构层次1.5iOS的系统架构从上而下分为4层,依次为CocoaTouch层、Media层、CoreServices层和CoreOS层,如右图所示。Core
OSCore
ServicesMediaCocoa
TouchiOS的系统架构
CocoaTouch层(可触摸层)该层为开发iOS应用程序提供了各种常用的框架(大部分框架与界面有关)和一些基本系统服务(如推送通知、触摸输入等)。从本质上来说,它负责用户在iOS设备上的触摸交互操作。
Media层(媒体层)通过该层,开发者可以在应用程序中使用各种媒体文件,包括绘制图形、录制音频和视频、制作基础的动画效果等。
CoreServices层(核心服务层)通过该层,应用程序可以访问iOS的一些核心服务,例如网络管理、联系人维护、偏好设置等。
CoreOS层(核心操作系统层)该层提供了一些底层功能(开发中一般不直接使用),如内存管理、文件系统、安全特性、电源管理、设备驱动等,它可以直接和硬件设备进行交互。感谢您的观看iOS开发实战02第二章iOS基本开发流程iOS的框架与设计模式2.1应用程序的开发流程2.2应用程序的测试与发布2.31.什么是框架所谓框架,实际上是一个半成品的应用,它封装了某领域内处理流程的控制逻辑。框架中包含了很多元素,但是这些元素之间关系的紧密程度要远远大于类库中元素之间的关系。框架中的所有元素都为了实现一个共同的目标而相互协作。框架类似类库,但两者又有明显的区别,包括以下几个方面。从结构上讲,框架内部是高内聚的,而类库内部则是松散的。1框架封装了处理流程的控制逻辑,而类库完全不涉及任何处理流程和控制逻辑。2框架专注于特定领域,而类库则是通用的;框架通常建立在众多类库基础之上,而类库一般不会依赖于某框架。32.CocoaTouchCocoaTouch本身是一个框架的集合,它包含了众多子框架,其中最重要的是Foundation框架和UIKit框架。前者是框架的基础,和界面无关,它包含了大量常用的API;后者包含基础UI类库。1)Foundation框架Foundation框架为所有应用程序提供基本的系统服务。Foundation框架提供许多基本的对象类和数据类型,使其成为应用程序开发的基础。总体而言,使用Foundation框架可以执行如下操作:创建和管理集,如数组和字典。访问存储在应用程序中的图像和其他资源。创建和管理字符串。发布和观察通知。创建日期和时间对象。自动发现IP网络上的设备。操控URL流。异步执行代码。2)UIKit框架UIKit框架提供了可用于创建基于触摸的用户界面的类,所有iOS应用程序都基于UIKit框架。UIKit框架提供基础结构,用于在屏幕上绘图、处理事件,以及创建通用用户界面元素。UIKit框架还通过管理屏幕上显示的内容,来组织复杂的应用程序。总体而言,使用UIKit框架可以执行如下操作:构建和管理用户界面。处理基于触摸和运动的事件。显示文本和网页内容。优化应用程序以实现多任务。创建自定义用户界面元素。1.MVC设计模式MVC全称Model-View-Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写。在iOS中,MVC设计模式主要分为3个部分,如右图所示。MVC模式各部分的功能如下。封装应用程序数据,并定义操控和处理这些数据的逻辑和运算。用户在视图中所进行的创建或者修改数据的操作通过控制器对象传达到模型对象,从而创建或更新模型对象。模型对象更改时(例如通过网络连接接收到新数据),它将通知控制器对象,控制器对象收到通知从而更新相应的视图对象。模型(Model)视图对象是应用程序中用户可以看见的对象。视图对象的主要目的就是显示来自应用程序模型对象中的数据,并使该数据可被编辑。视图(View)接受用户的请求,根据请求更新模型。另外,控制器还会更新所选择的视图作为对用户请求的回应。控制器是视图和模型的中介,它降低了视图和模型的耦合度,使视图和模型分工明确,从而提高了开发效率。控制器(Controller)MVC设计模式的特点为:01View上面显示什么东西,取决于Model。02只要Model数据改变了,View的显示状态会跟着改变。03Controller负责初始化Model,并将Model传给View去解析展示。2.代理设计模式代理(delegate)也叫委托,是iOS开发中常用的设计模式。代理是一种简单而功能强大的设计模式,这种模式用于使一个对象“代表”另外一个对象,然后和程序中其他的对象进行交互。代理设计模式主要包含3个部分,如图下所示。代理模式具体介绍如下。协议:用来指定代理方可以做什么,必须做什么。
代理方:遵守代理协议,完成委托方需要实现的功能。
委托方:制定代理协议,指定代理方去完成什么功能。
iOS的框架与设计模式2.1应用程序的开发流程2.2应用程序的测试与发布2.3本节将通过开发一个应用程序MyProject,让读者熟悉iOS应用程序的开发流程,并熟悉一些基本知识。该应用程序的效果如下图所示(为显示方便,此处隐藏了模拟器外观)。输出的字符串MyProject应用程序效果如19页中的图所示,该应用程序中有3个主要的用户界面元素,即:文本框:供用户输入信息。标签:用于显示信息。按钮:使标签中显示信息。1.新建项目具体步骤参照书中描述。2.应用程序的结构项目导航面板中显示了MyProject应用程序的结构,如右图所示。下面我们就来介绍一下各组成部分的功能和特点。应用程序的目录结构MyProject组用于存放MyProject应用程序的主要代码,它主要包含以下文件。
应用程序的代理,管理应用的整个生命周期。AppDelegate.swift
ViewController.swift根视图控制器,它是应用程序展示的第一个界面。
故事板设计视图。默认情况下,程序在启动时会主动加载并实现Main.storyboard,它的控件实现和相关的业务逻辑处理是交给ViewController.swift去实现的。Main.storyboard
用于存放项目中所需的图片资源,一般应用程序的图标都会放在这个文件夹中。Assets.xcassets
应用程序的启动页。
Info.plist应用程序配置文件,包含应用程序的图标、名字、主窗口的XIB文件等。LaunchScreen.storyboard3.AppDelegate.swift每个iPhone应用程序都有一个UIApplication,UIApplication是iPhone应用程序的入口,它能够帮助管理应用程序的生命周期,而UIApplication通过一个名为UIApplicationDelegate的代理类来履行这个任务。在创建项目时,Xcode会自动为我们生成一个AppDelegate类。在AppDelegate类中会调用UIApplicationMain创建一个UIApplication类的实例。AppDelegate通过遵守UIApplicationDelegate协议实现UIApplication的代理方法,来管理整个应用程序的生命周期。UIApplication负责接收事件,而UIApplicationDelegate则决定应用程序如何去响应这些事件。UIApplicationDelegate可以处理的事件包括应用程序的生命周期事件(比如程序启动和关闭)、系统事件(比如来电、记事项警告)等。下面就来学习在AppDelegate中实现了哪些UIApplicationDelegate协议中的方法。funcapplication(_application:UIApplication,didFinishLaunchingWithOptionslaunchOptions:[UIApplicationLaunchOptionsKey:Any]?)->Bool{returntrue}当程序载入后执行,该方法是应用程序的启动入口,只在应用程序启动时执行一次。application参数用来获取应用程序的状态、变量等。值得注意的是字典参数:(NSDictionary*)launchOptions,该参数存储程序启动的原因。funcapplicationWillResignActive(_application:UIApplication){}在应用程序将要由活动状态切换到非活动状态时,要执行该代理方法。例如,按下【Home】键返回主屏幕,或全屏之间切换应用程序等。funcapplicationDidEnterBackground(_application:UIApplication){}当应用程序被推送到后台时调用此方法。此方法用来释放共享资源、保存用户数据、停止计时器以及存储尽可能多的应用程序状态信息,以便之后恢复应用程序的当前状态。funcapplicationWillEnterForeground(_application:UIApplication){}当应用程序从后台将要重新回到前台时调用。在这个方法中可以撤销许多进入后台时所做的更改。funcapplicationDidBecomeActive(_application:UIApplication){}当应用程序已进入前台,并处于活动状态时调用。funcapplicationWillTerminate(_application:UIApplication){}当应用程序将要退出时调用,通常是用来保存数据和做一些退出前的清理工作。调用UIApplicationMain也会扫描应用程序的Info.plist文件。在项目导航面板的MyProject组中单击Info.plist文件,Xcode将在窗口的编辑器区域打开Info.plist文件,如右图所示。Info.plist文件MyProject应用程序仅包含一个视图控制器(即项目中的ViewController),它管理着由单视图提供的一个区域的内容。视图是一个对象,它在屏幕的矩形区域中绘制内容,并处理由用户触摸屏幕所引起的事件。一个视图也可以包含其他视图,这些视图称为分视图。当一个视图添加了一个分视图后,它被称为父视图,这个分视图被称为子视图。父视图、其子视图以及子视图的子视图(如果有的话)形成一个视图层次。一个视图控制器只管理一个视图层次。给由ViewController管理的视图添加3个分视图,以创建视图层次,这3个分视图分别表示文本框、标签和按钮。4.查看故事板设计视图在项目导航面板中单击Main.storyboard文件,Xcode会自动在编辑器区域打开设计视图(设计视图文件后面的区域被称为画布)。设计视图的工作区窗口如右图所示。画布初始场景指示器场景场景列表场景台设计视图的工作区窗口过渡场景故事板场景代表视图控制器,过渡则表示两个场景之间的转换。在画布上看到的场景称为ViewControllerScene,因为它是由ViewController对象来管理的。ViewControllerScene由一些对象组成,显示在Xcode场景列表(位于画布和项目导航面板之间)中,主要有以下3项。ViewController对象(以黄色球体内浅色矩形表示)。
第一响应器占位符对象(以橙色立方体表示)。
名为Exit的占位符对象,用于展开序列。
5.在模拟器中运行程序即使没有编写任何代码,我们也可以在模拟器(Simulator)中运行应用程序。顾名思义,模拟器可模拟应用程序在iOS设备上的运行状况,能够让我们初步了解应用程序的外观和行为。具体步骤参照书中描述。Xcode提供了对象库,我们可以将库中的对象添加到设计视图文件上。ViewController场景已经包含了一个视图。现在需要添加一个按钮、一个标签和一个文本框。然后,在这些元素和视图控制器类之间建立连接,以便元素提供我们想要的行为。1.添加用户界面元素将对象库中的用户界面(UI)元素拖拽到画布上的视图中,来添加用户界面元素。UI元素添加到视图后,我们可以适度移动它们的位置和调整其大小。具体步骤参照书中描述。2.为按钮创建连接当用户激活一个UI元素时,该元素可以向知道如何执行相应操作方法的对象发送一则操作消息。这种互动是目标操作机制的一部分,该机制是另一种CocoaTouch设计模式。使用Xcode,我们可以将操作添加到UI元素,并设置其相应的操作方法。方法是:按住【control】键的同时将画布上的元素拖拽到源文件(如ViewController.swift)中的相应位置。设计视图文件会将我们通过这种方式创建的连接归档存储下来。稍后,应用程序载入设计视图时,会恢复这些连接。归档是一种很常用的文件存储方法,几乎任何类型的对象都能够被归档存储(实际是将文件存到硬盘,解档时从硬盘还原)。例如://创建一个对象varp=Person()="Tom"p.age=17p.height=180.0//获取存放路径letpath="\(NSSearchPathForDirectoriesInDomains(.documentDirectory,.userDomainMask,true).first!)/person.data"//将对象p归档存入已获取的路径中NSKeyedArchiver.archiveRootObject(p,toFile:path)//解档取出保存的对象ifNSKeyedUnarchiver.unarchiveObject(withFile:path)!=nil{p=(NSKeyedUnarchiver.unarchiveObject(withFile:path)as?Person)!}具体步骤参照书中描述。3.为文本框和标签建立OutletOutlet描述了两个对象之间的连接。当我们希望一个对象(例如视图控制器)和它包含的对象(例如文本框)进行通信时,须将被包含的对象指定为Outlet。具体步骤参照书中描述。4.建立文本框的委托连接除此之外,我们还需要在应用程序中建立另一个连接:我们需要将文本框连接到指定的代理对象上。我们之所以需要为文本框指定一个代理对象,是因为当用户点击键盘中的Done键时,文本框会发送消息给它的代理(前面提到过,代理是代表另一个对象的对象)。具体步骤参照书中描述。实施视图控制器包括这3个部分:①为用户姓名添加属性;②实现按钮点击事件changeWords方法;③实现文本框的代理方法。实施视图控制器1.为用户姓名添加属性我们需要为保存用户姓名的字符串添加属性声明,这样我们的代码就总能引用该字符串了。在项目导航面板中选择ViewController.swift文件,在ViewController类中文本框与标签声明代码的下方添加如下代码:varnameString:String?2.实现changeWords方法在2.2.2节“配置视图”中,我们配置了Hi按钮的操作连接,因此当用户点击该按钮时,它会发送changeWords消息给视图控制器。作为响应,我们想要视图控制器将用户在文本框中输入的文本显示在标签中。具体来说,changeWords方法应该:01从文本框取回字符串,并将视图控制器的nameString属性设定为此字符串。02基于nameString属性,创建新的字符串,并将其显示在标签中。单击项目导航面板中的ViewController.swift文件,在打开的ViewController类中找到changeWords方法,在该方法中添加如下代码:@IBActionfuncchangeWords(_sender:UIButton){//用nameString属性(模型)保存用户输入信息
nameString=TextField.text//创建一个新的变量并将其设为视图控制器的nameString属性
varname=nameString//判断输入信息是否为空
if(name?.isEmpty)!{name="nicetomeetyou"}//将拼接后的字符串信息显示在标签上
self.greetingLbl.text=String(format:"%@,%@!","Hi",name!)}3.实现文本框的代理方法此时,如果编译并运行应用程序,在点击Hi按钮时应该会看到标签上显示“Hi,nicetomeetyou”。如果我们点击文本框,并开始用弹出的键盘输入,会发现完成文本输入后,仍然无法收回键盘。因为我们已经将视图控制器设定为文本框的代理,所以视图控制器可以实施该方法,通过发送resignFirstResponder消息强制文本框失去第一响应器状态,使键盘消失。UITextFieldDelegate协议是由UIKit框架定义的,它包括textFieldShouldReturn方法,当用户点击键盘上的Done键(不管该按钮的实际名称是什么)时,文本框调用该方法。打开ViewController.swift文件,在ViewController类中最下方实现textFieldShouldReturn方法,代码如下:functextFieldShouldReturn(_textField:UITextField)->Bool{iftextField==TextField{//文本框放弃第一响应器状态
textField.resignFirstResponder()}returntrue}然后,在ViewController类声明的后面添加UITextFieldDelegate,以遵守文本框的代理协议,代码如下:classViewController:UIViewController,UITextFieldDelegate{……}在MyProject应用程序中,其实已经体现了MVC设计模式。其中,模型对象是由ViewController类创建的nameString属性,它用于保存用户的输入信息;控制器对应ViewController类和AppDelegate类的实例;而视图则是程序中的视图对象,包括文本框、标签、按钮和背景视图。iOS的框架与设计模式2.1应用程序的开发流程2.2应用程序的测试与发布2.3通常情况下,我们都是在Xcode提供的模拟器中运行和测试(或调试)应用程序。模拟器可以基本展示应用程序的实现效果。Xcode内建了调试环境,在应用程序运行时,我们可以锁定单个线程,并跟踪该特定线程的执行。具体步骤参照书中描述。在Xcode7之前,开发的应用程序要想在iOS设备上运行,需要付费的苹果开发者账号(也属于AppleID)对其进行数字签名才行。自Xcode7之后,开发者只需要一个普通的AppleID也可以连接iOS设备对应用程序进行运行和测试了(尽管特定时间内对测试的应用程序数量有些限制)。下面,我们开始在iOS设备上编译和运行MyProject应用程序。首先需要在Xcode中设置账号,然后将iOS设备连接至电脑,并选择在已连接的iOS设备上编译和运行应用(此过程中需要对iOS设备进行信任设置),之后就可以在iOS设备上运行和测试应用程序了。具体步骤参照书中描述。将应用程序发布到AppStore,大致需要经过下图所示的这几个步骤。应用发布流程图感谢您的观看iOS开发实战03第三章基础UI控件视图控制器和视图3.1常用的界面构建方式3.2常用视图控件的用法3.3视图控制器是应用程序数据与视图之间通信的重要桥梁。应用程序的用户界面中所显示的内容是由控制器或一组视图控制器协调管理的。因此,视图控制器提供了一个基本的框架来构建应用程序。1.常用的视图控制器类型UIViewController是MVC设计模式的核心,它是所有控制器的父类。iOS提供了许多内置的视图控制器,以支持标准的用户界面。其中较常用的视图控制器还有:即导航控制器,它是iOS中最常用的多视图控制器之一,是专门用来管理ViewController的一个容器类。UINavigationController即标签控制器,它与导航控制器类似,也是一个容器类。不同的是,标签控制器所管理的控制器之间是并列关系,不需要界面跳转。UITabBarController即表视图控制器,是集成了UITableView视图的控制器。UITableViewController2.视图对象的生命周期生命周期是指一个对象从被创建出来到最后被释放销毁的整个过程。在开发过程中,为了保持内存的有效利用以及程序的高效运行,当需要一个对象时,它会被创建并且给它分配相应的内存空间;当不再需要这个对象时,就应该将这个对象释放并收回内存空间。每个视图控制器被创建出来时,都会有一个初始View。当一个控制器从被创建到销毁时,它的View会显示不同的状态,这就是视图的生命周期。在视图生命周期的不同时段,系统会调用视图控制器上的不同方法,如右图所示。视图的生命周期控制器通过调用loadView()方法创建视图并加载到内存中,之后调用viewDidLoad()方法来进行下一步设置,此时视图还未显示。viewDidLoad()方法在视图生命周期中只调用一次,因此通常在这个方法中做界面的布局以及数据初始化等设置。其调用代码如下:overridefuncviewDidLoad(){super.viewDidLoad()}系统在载入所有数据之后,视图已经准备就绪,在视图显示前后会调用viewWillAppear(_:)方法和viewDidAppear(_:)方法。在即将退出这个界面时,即视图即将不可见前后会调用viewWillDisappear(_:)方法和viewDidDisappear(_:)方法。这4个方法可以被重复调用多次。通常,如果需要每次进入界面都刷新数据的话,可以在viewWillAppear(_:)方法中设置。viewWillAppear(_:)方法的调用方法如下:overridefuncviewWillAppear(_animated:Bool){super.viewWillAppear(animated)}此外,当系统内存不足时,即系统低内存时,会调用didReceiveMemoryWarning()方法。此方法主要用于释放内存,包括视图控制器中的一些成员变量和视图等。其调用代码如下:overridefuncdidReceiveMemoryWarning(){super.didReceiveMemoryWarning()}在CocoaTouch框架中,所有的视图都继承自UIView,可见UIView是所有视图的“根”。UIView一般称为空白视图。1.UIView的层级结构UIView表示屏幕上的一块矩形区域,负责渲染区域的内容,并影响该区域内发生的触摸事件,其继承关系如右图所示。UIView的继承层级关系之所以称之为“控件类”,是因为只要是继承自UIControl类的视图都可以响应一些高级事件。比如UIButton,我们可以为一个按钮添加点击事件,点击这个按钮可以改变View的背景颜色。具体实现代码如下:overridefuncviewDidLoad(){super.viewDidLoad()//创建一个按钮
letbtn=UIButton(type:.custom)//设置按钮的位置和大小
btn.frame=CGRect(x:100,y:300,width:200,height:100)
//设置按钮的背景颜色
btn.backgroundColor=UIColor.blue//添加按钮点击事件
btn.addTarget(self,action:#selector(changeViewColor),for:UIControlEvents.touchUpInside)self.view.addSubview(btn)}//实现按钮点击事件方法,改变视图的背景颜色@objcfuncchangeViewColor(){self.view.backgroundColor=UIColor.red}而其他没有继承UIControl类的视图是不能响应高级事件的,但其可以响应较低级的事件。2.UIView的基本属性UIView的基本属性如下表所示。UIView的基本属性属性功能应用实例varsuperview:UIView?用于获取当前视图的父视图letsuperview:UIView?=self.view.superviewvarsubviews:[UIView]用于获取当前视图的子视图letsubviews:[UIView]?=self.view.subviewsvarwindow:UIWindow?返回当前视图的窗口letwindow:UIWindow?=self.view.windowvartag:Int获取或设置视图的标识ID,父视图可以通过tag找到子视图,默认为0设置视图tag值:self.view.tag=100获取视图tag值:letviewTag:Int=self.view.tagvarframe:CGRect视图相对于父视图的坐标和尺寸(以父视图的左上角为坐标原点)self.view.frame=CGRect(x:0,y:0,width:300,height:200)属性功能应用实例varbounds:CGRect视图相对于自身的坐标和尺寸(以自己左上角为坐标原点,所以bounds的x/y一般为0)获取当前视图的bounds:letbounds:CGRect=self.view.boundsvarcenter:CGPoint视图的中心点(以父视图的左上角为坐标原点)获取当前视图的中心点:letcenter:CGPoint=self.view.centervaralpha:CGFloat用于设置视图的透明度self.view.alpha=0.6(取值范围是0.0~1.0)varbackgroundColor:UIColor?用于设置视图的背景颜色self.view.backgroundColor=UIColor.
blueUIView的基本属性续15页和16页表中这些都是在构建视图界面时经常用到的属性,其中最容易混淆的是frame属性和bounds属性。frame
bounds坐标系是基于父视图的,是该视图在父视图中的位置和大小。坐标系是基于自身的,其坐标原点(x,y)永远都是(0,0),主要用于获取其大小。我们通常使用frame属性来确定视图的位置和大小,而bounds属性使用得较少,主要因为bounds属性是基于本地坐标系的。接下来,我们通过一个例子来解释frame和bounds属性的区别。主要代码如下:overridefuncviewDidLoad(){super.viewDidLoad()//创建视图viewAletviewA=UIView(frame:CGRect(x:50,y:20,width:280,height:400))//设置视图viewA的背景颜色
viewA.backgroundColor=UIColor.red//将视图viewA添加到根视图中
self.view.addSubview(viewA)//创建视图viewBletviewB=UIView(frame:CGRect(x:30,y:10,width:150,height:200))//设置视图viewB的透明度(0.0~1.0之间)
viewB.alpha=0.6//设置视图viewB的背景颜色
viewB.backgroundColor=UIColor.yellow//将视图viewB添加到视图viewA中
viewA.addSubview(viewB)//打印视图viewB的frameNSLog("viewF_x:%.2f,viewF_y:%.2f",viewB.frame.origin.x,viewB.frame.origin.y)NSLog("viewF_w:%.2f,viewF_h:%.2f",viewB.frame.size.width,viewB.frame.size.height)//打印视图viewB的boundsNSLog("viewBounds_x:%.2f,viewBounds_y:%.2f",viewB.bounds.origin.x,viewB.bounds.origin.y)NSLog("viewBounds_w:%.2f,viewBounds_w:%.2f",viewB.bounds.size.width,viewB.bounds.size.height)}按住【command】键的同时将光标移至frame属性上方,此时frame属性会高亮显示[见右侧上图(a)],单击鼠标右键,从弹出的快捷菜单中选择对应选项[见右侧下图(b)],可以跳转到定义。(a)(b)跳转到定义操作
此时代码编辑区自动跳转到UIKit框架下的UIView.h文件的frame定义处,可以看到frame属性是CGRect类型,如右图所示。frame属性源码声明按照同样的方法,继续查看CGRect类型。按住【command】键,并在CGRect类型上方单击鼠标右键,自动跳转到类库的CGRect定义处,如右图所示。可以看到CGRect是一个结构体,包含origin与size两个成员和两个初始化方法。其中,origin表示坐标点,是CGPoint结构体;size表示宽和高,是CGSize结构体。CGRect结构体按照同样的方法,继续查看当前位置的CGPoint结构体和CGSize结构体,分别跳转到类库的对应定义处,如下图所示。可以看到,它们都包含两个初始化方法;此外,CGPoint结构体有两个成员x和y,CGSize结构体有两个成员width和height。CGPoint和CGSize结构体运行程序,在调试区域可以看到输出的日志,如下图所示。调试区域输出的日志程序运行界面如右图所示。视图viewA视图viewB程序运行界面右图中展示和对比了视图viewA与viewB的frame及bounds属性。视图viewA和viewB示意图3.应用界面的构建层次应用程序的用户界面是由若干视图对象构成的,这些视图对象的构建层次类似于树形结构。从右图中可以看出,该界面中有一个UIWindow(窗口),其中包含一个根视图UIView,UIView又有一个子视图viewA,viewA又有一个子视图viewB。viewBviewA根视图window应用界面的构建层次应用程序需要在启动时创建并设置UIWindow对象,然后为其添加其他视图。加入窗口的视图会成为该窗口的子视图。窗口的子视图还可以拥有自己的子视图,从而形成一个以UIWindow对象为根视图的,类似树形的构建层次。通常情况下,一个应用有且只有一个UIWindow对象,UIWindow对象包含了一个根视图UIView。UIWindow对象就像一个容器,负责包含应用中所有的视图。了解了视图的基本属性和应用界面的构建层次等知识之后,接下来学习UIView提供的较常用的方法,如下表所示。UIView的常用方法方法功能应用实例funcaddSubview(_view:UIView)添加一个视图到另一个视图里viewA.addSubview(viewB)funcinsertSubview(_view:UIView,atindex:Int)插入视图,并指定索引viewA.insertSubview(viewB,at:3)funcremoveFromSuperview()从父视图中移除视图viewA.removeFromSuperview()视图控制器和视图3.1常用的界面构建方式3.2常用视图控件的用法3.3在iOS开发中,主要有3种界面构建方式。使用故事板使用XIB使用纯代码界面构建方式下面,我们从使用故事板构建界面开始学习。1.什么是故事板故事板(storyboard)是从iOS5.0以后引入的新技术,它用于在一个窗口中显示整个应用程序用到的所有或者部分界面,并可以定义各个界面之间的关系,将各个界面之间的跳转关系更直观地展示出来。故事板(storyboard)的本质是一个XML文件,它描述了若干窗体、组件、AutoLayout约束等关键信息。项目案例展示参照书中描述。2.场景和过渡故事板(storyboard)主要由场景(scene)和过渡(segue)构成。例如,右图所示故事板中包括三个场景和两个过渡。每个场景中都有一个视图控制器,视图控制器通过其view属性获得要管理的视图,并通过管理视图来显示界面;多个场景之间通过“过渡”连接并定义它们之间的跳转(导航)方式。过渡场景列表视图控制器管理的视图视图控制器故事板中的场景和过渡跳转(导航)方式决定了场景之间采用什么样的过渡类型,下面介绍一下过渡类型的种类。ShowShowDetail在master(主场景)或detail(详细场景)区域展示内容(典型的如iPad的设置界面,左侧是master,右侧是detail),但具体显示在哪个区域,主要取决于要显示什么内容。如果不分master和detail,将只是单纯地把新内容push到当前视图控制器栈的顶部。大致同Show,区别在于当采用UISplitViewController(分割视图控制器)时,在detail区域展示内容。PresentModallyPresentasPopover模态展示内容,有多种不同的呈现方式,可以根据需要设置,比如以动画的形式自下向上覆盖整个屏幕。在当前的View上出现一个小的浮动窗口来展示内容,比如选中文字后出现“复制/翻译”等内容的视图就是这种。1.什么是XIBXIB是一个轻量级的用来描述局部界面的文件,它是一种与故事板(storyboard)相似的技术,在本质上也是一个XML文件。2.使用XIB重建HelloWorld项目在Xcode6.0版本之后就没有能够直接创建XIB的项目模板了,可见苹果开始重点支持故事板技术了。接下来详细介绍如何通过XIB实现HelloWorld应用。具体步骤参照书中描述。任何功能都可以用代码来完成,纯代码更有利于后期维护,但调试起来比较麻烦,界面每次的修改结果只能重新运行才能看到。下面利用纯代码实现HelloWorld程序效果。具体步骤参照书中演示。首先来看一下故事板的优点。01一个故事板描述了一个故事,一个应用可以有很多故事线。如果在项目前期能够合理规划这些故事线,那么整个项目的结构就会变得非常清晰。02故事板是苹果公司鼓励开发者使用的新型技术,新技术往往会总结之前技术的不足并尽可能解决,故事板也不例外。03故事板使界面布局更加简洁、直观,逻辑更加清晰。04故事板调整业务逻辑或者测试代码都非常简单,只需拖动鼠标即可,并且所见即所得。那么,故事板又存在哪些缺点呢?很多情况下,我们都是一个团队协同开发,但一个项目中只有一个故事板文件,有时候会出现多个人同时修改故事板的情况,此时就会发生冲突,而XIB和纯代码方式在团队开发代码版本管理方面更有优势。故事板不能复用,如果有需要复用的功能模块,可以用XIB进行封装,然后再引入故事板。下面简要介绍一下如何在不同的情况下使用不同的界面构建方式。(1)当有如下情况存在时,推荐使用故事板。应用中存在多种View的层级关系。应用中存在列表或者表格单元模板。不是动态或者复杂界面布局。(2)当有如下情况存在时,推荐使用XIB。为模态视图。存在大量可复用的视图组件或者模板。不是动态或者复杂界面布局。(3)纯代码方式几乎是万能的,任何情况都可以使用,尤其是在完成动态布局或者特效视图时更是首选。但它也存在构建界面不直观,开发工作量巨大等缺点。视图控制器和视图3.1常用的界面构建方式3.2常用视图控件的用法3.3标签控件(UILabel)是一个只能用于显示文字的静态控件,它没有继承UIControl基类,无法直接与用户进行交互。标签控件(UILabel)的常用属性如下表所示。标签控件(UILabel)的常用属性属性功能应用实例vartext:String?设置文字label.text="HelloWorld!"varfont:UIFont!设置字体和字号label.font=UIFont.boldSystemFont(ofSize:21.0)vartextColor:UIColor!设置文字颜色label.textColor=UIColor.bluevartextAlignment:NSTextAlignment设置文字对齐模式(比如左对齐、居中对齐、右对齐)label.textAlignment=.centervarnumberOfLines:Int标签文字的显示行数,默认为1,表示一行显示;设置为0,表示不限制行数(自动换行)label.numberOfLines=0标签控件(UILabel)是一个只能用于显示文字的静态控件,它没有继承UIControl基类,无法直接与用户进行交互。标签控件(UILabel)的常用属性如下表所示。标签控件(UILabel)的常用属性属性功能应用实例vartext:String?设置文字label.text="HelloWorld!"varfont:UIFont!设置字体和字号label.font=UIFont.boldSystemFont(ofSize:21.0)vartextColor:UIColor!设置文字颜色label.textColor=UIColor.bluevartextAlignment:NSTextAlignment设置文字对齐模式(比如左对齐、居中对齐、右对齐)label.textAlignment=.centervarnumberOfLines:Int标签文字的显示行数,默认为1,表示一行显示;设置为0,表示不限制行数(自动换行)label.numberOfLines=0图片控件(UIImageView)与标签控件(UILabel)一样,也继承自UIView基类,它是用于显示图片的静态控件,同样无法直接与用户进行交互。图片控件(UIImageView)的常用属性图片控件(UIImageView)的常用属性如下表所示。属性功能应用实例varimage:UIImage?设置图片控件显示的图片imageView.image=UIImage.init(named:"icon")varisUserInteractionEnabled:Bool是否允许与用户交互(默认为NO)imageView.isUserInteractionEnabled=true下面,我们通过创建一个Label_ImageView1应用程序,来介绍标签控件和图片控件的使用方法。该应用程序的实现效果如右图所示,其中包含一个标签和一张图片,标签用来描述这张图片。Label_ImageView1运行效果1.使用InterfaceBuilder创建具体步骤参照书中描述。2.使用代码实现以上,我们使用故事板实现了Label_ImageView1应用,下面介绍如何用纯代码实现它。具体步骤参照书中描述。按钮控件(UIButton)继承了UIControl基类,是应用程序中最简单的交互控件,它主要用于响应用户在应用界面中的点击事件。按钮控件(UIButton)分为以下几种类型:
自定义类型。通常我们会选择此类型,进行自定义设置。
System系统默认类型,iOS会提前设置好按钮的一些属性。
细节展示按钮,主要用于表视图中的细节展示。DetailDisclosureCustom
这两个是信息按钮
(样式与细节展示按钮一样),表示有一些简短的说明信息需要展示,或有可以设置的内容。
AddContact添加联系人按钮
。InfoLight和InfoDark对应属性检查器中的Type属性,见右图。按钮的Type属性按钮的StateConfig属性按钮控件(UIButton)具有4种状态(对应属性检查器中的StateConfig属性,见右图),分别是Default(默认)、Highlighted(高亮)、Selected(选中)和Disabled(不可用)。通过为按钮选择不同的StateConfig选项,可以设置按钮在不同状态下的属性。按钮的一些常用属性的设置方法如下。(1)设置按钮的文字:funcsetTitle(_title:String?,forstate:UIControlState) //方法button.setTitle("我是按钮",for:.normal) //实例(2)设置按钮的文字颜色:funcsetTitleColor(_color:UIColor?,forstate:UIControlState) //方法button.setTitleColor(UIColor.red,for:.normal) //实例(3)设置按钮内部的小图片:funcsetImage(_image:UIImage?,forstate:UIControlState) //方法button.setImage(UIImage.init(named:"icon"),for:.normal) //实例(4)设置按钮的背景图片:funcsetBackgroundImage(_image:UIImage?,forstate:UIControlState) //方法button.setBackgroundImage(UIImage.init(named:"icon"),for:.normal) //实例(5)设置按钮的文字字体(需要用按钮内部的label来设置):funcsystemFont(ofSizefontSize:CGFloat) //方法button.titleLabel?.font=UIFont.systemFont(ofSize:18.0) //实例下面,我们通过创建一个Button1应用程序,来实现点击按钮改变自身的背景颜色,从而学习如何使用按钮。Button1应用程序的运行效果如右图所示。黄色背景红色背景Button1运行效果1.使用InterfaceBuilder创建具体步骤参照书中描述。2.使用代码实现创建一个名为Button2的项目,并参照3.2.3节介绍的方法将项目改为纯代码项目。具体步骤参照书中描述。与标签控件(UILabel)相比,文本框控件(UITextField)和文本视图控件(UITextView)多了一项键盘设置。另外,文本框控件(UITextField)和文本视图控件(UITextView)还各有一个代理协议(UITextFieldDelegate和UITextViewDelegate)。与标签控件(UILabel)一样,文本框控件(UITextField)和文本视图控件(UITextView)也都属于文本类视图,三者都可以通过代码、双击控件和属性检查器中的Text属性来设置文本内容。其中,文本视图控件(UITextView)是一个可展示和编辑多行文本的控件。文本框控件(UITextField)继承自UIControl基类,它和按钮控件(UIButton)一样,也能响应事件,可以与用户直接进行交互,经常被用作账号密码输入框和信息输入框等;文本视图控件(UITextView)继承自UIScrollView(滚动视图),可以滑动,主要用于文字展示和文本输入。下面,我们通过创建一个TextField_TextView1应用程序,来向大家展示文本框控件(UITextField)和文本视图控件(UITextView)的用法。该应用程序的界面如下图所示,其中包括两个标签(Name:和Abstract:)、一个文本框控件(UITextField)和一个文本视图控件(UITextView)。TextField_TextView1运行效果该应用程序要实现的功能是:用户轻触文本框调出系统自带键盘,通过键盘输入姓名,点击return键,系统收回键盘;用户轻触文本视图控件调出系统自带键盘,通过键盘输入自我介绍,点击return键,系统收回键盘。1.使用InterfaceBuilder创建具体步骤参照书中描述。2.使用代码实现创建一个名为TextField_TextView2的项目,并参照3.2.3节介绍的方法将项目修改为纯代码项目。具体步骤参照书中描述。下面利用本章学习过的图片、标签、文本框和按钮等基础UI控件,开发一个类似QQ登录界面的userLogin应用程序,其效果如右图所示。userLogin运行效果程序功能:①点击文本框,可通过系统键盘分别输入账号和密码;②点击文本框右边的清除按钮,可以清除输入的内容;③密码文本框可实现安全输入;④在输入账号和密码的情况下点击“登录”按钮,弹框提示登录成功;⑤在没有输入账号或密码的情况下点击“登录”按钮,分别给出相应提示;⑥点击键盘上的return键,收回键盘。具体步骤参照书中描述。感谢您的观看iOS开发实战04第四章高级UI控件视图控制器和视图4.1常用的界面构建方式4.2常用视图控件的用法4.3常用的界面构建方式4.4常用视图控件的用法4.5导航控制器用UINavigationController表示,它是UIViewController的一个很重要的子类。严格来说,导航控制器并不是视图控制器,它是一种搭建多视图架构的模式,用于实现多个视图控制器之间的切换。导航控制器是一个容器视图控制器,它采用了堆栈的设计模式,以栈的形式保存子控制器。堆栈模式的特点是:先进后出,后进先出。当用户切换场景时,导航控制器会将子控制器依次压入栈中,展现在屏幕界面上的永远是栈顶的子控制器中的视图。反之,当返回上一级时,后压入栈中的视图控制器会被先弹出。导航控制器中的界面切换,实际上切换的只是导航控制器中的子控制器。接下来看一下iPhone中导航控制器的实际应用,如下图所示。iPhone设置中体现的导航控制器应用在iOS开发文档中,导航控制器的切换使用压入栈操作(push)和弹出栈操作(pop)来描述。在第6页中的图所示应用示例中,点击“通用”→“语言与地区”的过程就是一个栈的压入过程(实线箭头方向所示);反之,如果点击左上角的相应返回按钮,则是栈的弹出过程(虚线箭头方向所示),如右图所示。导航控制器的栈结构示意图从第7页图中可以看到,最先压入栈的控制器在最下面,最后进去的在最上面。最上面的视图控制器也就是这个导航控制器对外展示的界面,当我们push进去一个新的视图控制器时,对用户而言就是打开了一个新的界面。pop只能删除栈顶的视图控制器,对用户而言就是从当前视图返回到上一级视图。导航控制器主要由导航栏(Navigationbar)、工具栏(Navigationtoolbar)、显示视图(Navigationview)和内容视图(Customcontent)组成,右图所示为导航控制器的层级结构图。导航栏(Navigationbar)显示视图(Navigationview)内容视图(Customcontent)工具栏(Navigationtoolbar)导航控制器的层级结构导航栏(Navigationbar)工具栏(Navigationtoolbar)它和导航控制器是一对一的关系。它管理一个视图控制器的栈,用来显示树形结构中的视图。位于屏幕底部,它可以放置UIBarButtonItem(工具栏按钮),按钮数一般不超过5个。其中,导航栏(Navigationbar)中主要包括导航栏项目(UINavigationItem)和导航栏按钮(UIBarButtonItem)。导航栏项目(UINavigationItem)导航栏按钮(UIBarButtonItem)它在每个界面中都会看到,分为左、中、右三个区域。其中,左边区域一般放置一个返回按钮(设定属性是backBarButtonItem)或左按钮(设定属性是leftBarButtonItem);右边区域一般放置一个右按钮(设定属性是rightBarButtonItem);中间区域是标题(属性是title)或者提示信息(属性是prompt)。导航栏和导航栏项目是一对多的关系。与工具栏中的按钮一样,它是导航栏中的左、右按钮。下面,我们通过创建一个TwoNavigation应用程序来实现两个界面间的跳转,运行效果如右图所示。具体功能为:在First界面中点击“跳转”按钮,跳转到Second界面;在Second界面中点击左上角的“返回”按钮,返回到First界面。TwoNavigation程序运行效果1.添加导航控制器用Xcode创建一个名为TwoNavigation的项目,在Main.storyboard文件中添加一个导航控制器,并将该导航控制器设置为程序的初始视图控制器。具体步骤参照书中描述。2.添加第二个视图控制器具体步骤参照书中描述。3.添加按钮具体步骤参照书中描述。视图控制器和视图4.1常用的界面构建方式4.2常用视图控件的用法4.3常用的界面构建方式4.4常用视图控件的用法4.5与导航控制器类似,标签控制器(UITabBarController)也是用于管理视图控制器的一个UI控件,它是一个容器类,且内部封装了一个标签栏。与导航控制器不同的是,导航控制器是以栈的方式管理视图,各个视图之间的切换就是压入栈和弹出栈操作,视图控制器之间存在层级关系;而标签控制器则是以平行的方式管理视图,通过标签的切换来切换视图控制器,视图控制器之间不存在层级关系,是并列存在的。因此,一个视图控制器一旦被加入到标签控制器中,那么只要标签控制器存在,这个视图控制器就不会被释放。标签控制器中管理的各个视图控制器是并列存在的,标签控制器有几个子控制器,就需要几个标签按钮与之相对应。点击标签控制器按钮时,将会跳转到与之对应的视图控制器上,如右图所示。标签控制器的工作原理与导航控制器类似,标签控制器主要由标签栏(Tabbar)、标签控制器视图(Tabbarcontrollerview)和内容视图(Customcontent)组成,右图所示为标签控制器的层级结构图。标签控制器视图(Tabbarcontrollerview
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026事业单位工勤技能-河北-河北园林绿化工二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-山东-山东水工监测工二级(技师)历年参考题库含答案详解3套试卷
- 2026事业单位工勤技能-内蒙古-内蒙古保育员三级(高级工)历年参考题库含答案详解3套试卷
- 产品质量管理体系认证培训教材(标准版)
- 2026 年夏季四防中毒窒息事故案例警示教育课件
- 2026年秋季开学中层干部压力管理管理培训
- 2026年秋季开学初三零碎时间利用主题班会课件
- 2026年山东省莱州市《行测》考试模拟试卷(巩固)附答案详解
- 2025年江苏省仪征市《行测》考试模拟试卷含完整答案详解【考点梳理】
- 2026年河南省辉县市《行测》考试考前冲刺试卷(精练)附答案详解
- 2026年泸西县中枢镇中心学校农
- 2025年长春市公务员录用考试《申论》真题及参考答案(甲类)
- 2026年中医药行政执法试题(含答案)
- 抑郁障碍与心脑血管疾病共病多学科诊疗指南
- 2026上海青浦区练塘镇招聘40人考前冲刺密卷AB卷附答案详解
- 2026年水生生物病害防治员专项题库(附答案与解释)
- 2026年全国中医助理医师资格真题试卷及答案
- 电车充电桩报废更新管理手册
- 2026年上半年宁波市北仑区(开发区)公开招聘国有企业工作人员(港城英才)17人笔试备考题库及答案详解
- 防腐施工安全技术操作规程
- JJF(川)143-2017 在线温度测量系统校准规范
评论
0/150
提交评论