![SwiftUI自定义视图开发_第1页](http://file4.renrendoc.com/view14/M08/12/38/wKhkGWYmjSKAM__JAAC4NbMzkQk465.jpg)
![SwiftUI自定义视图开发_第2页](http://file4.renrendoc.com/view14/M08/12/38/wKhkGWYmjSKAM__JAAC4NbMzkQk4652.jpg)
![SwiftUI自定义视图开发_第3页](http://file4.renrendoc.com/view14/M08/12/38/wKhkGWYmjSKAM__JAAC4NbMzkQk4653.jpg)
![SwiftUI自定义视图开发_第4页](http://file4.renrendoc.com/view14/M08/12/38/wKhkGWYmjSKAM__JAAC4NbMzkQk4654.jpg)
![SwiftUI自定义视图开发_第5页](http://file4.renrendoc.com/view14/M08/12/38/wKhkGWYmjSKAM__JAAC4NbMzkQk4655.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1/1SwiftUI自定义视图开发第一部分SwiftUI视图生命周期 2第二部分视图布局与尺寸计算 9第三部分数据绑定与状态管理 12第四部分自定义视图修改规则 13第五部分可访问性与用户交互 16第六部分绘图和动画效果 18第七部分环境对象与依赖注入 21第八部分高级视图容器 23
第一部分SwiftUI视图生命周期关键词关键要点SwiftUI视图生命周期
1.视图的生命周期从创建开始,在移除视图时结束。
2.视图的生命周期有不同的阶段,包括创建、初始化、更新和销毁。
3.每个生命周期阶段都有特定的方法,允许开发者执行特定任务,例如加载数据、更新视图或释放资源。
创建和初始化
1.视图的创建从调用`init(frame:)`方法开始。
2.初始化阶段包括设置视图的属性并创建子视图。
3.开发者可以在`init`方法中执行自定义初始化任务,例如加载数据或设置观察程序。
更新
1.当视图的属性或状态发生更改时,视图会更新。
2.更新阶段调用`body`属性,该属性计算并返回视图的当前内容。
3.开发者可以在`body`中使用条件语句、循环和数据绑定来以响应变化更新视图。
处理事件
1.SwiftUI提供了内置的事件处理方法,允许视图响应用户交互。
2.这些方法包括`onTapGesture`、`onLongPressGesture`和`onDragGesture`。
3.开发者可以在这些方法中编写自定义代码以处理相应事件。
环境对象
1.环境对象允许视图访问父视图或其他部分的应用程序中的共享数据。
2.环境对象通过使用`@EnvironmentObject`属性包装器声明。
3.开发者可以在视图中使用`environmentObject`方法来设置环境对象。
拆除
1.当视图从视图层次结构中移除时,它会进入销毁阶段。
2.销毁阶段调用`deinit`方法,使开发人员有机会释放分配的资源和取消观察程序。
3.正确处理销毁非常重要,因为它可以防止内存泄漏和崩溃。SwiftUI视图生命周期
SwiftUI视图生命周期定义了视图从创建到销毁过程中经历的不同阶段。以下是各个阶段的详细说明:
1.初始化
*`init(frame:)`:视图的初始化方法,接受一个可选的帧参数。
*`body`:视图的主体,定义视图的外观和行为。
2.创建
*`_makeView(context:)`:创建一个本机视图并将其存储在`UIView`或`NSView`变量中。
*`updateUIView(_:context:)`(`UIView`)和`updateNSView(_:context:)`(`NSView`):更新本机视图的实际布局和内容。
3.布局
*`layout(proposedSize:)`:计算视图所需的理想大小。
*`sizeThatFits(_:)`:指定视图在给定约束下可以适应的最大大小。
4.呈现
*`render(in:)`:将视图绘制到指定上下文。
5.更新
*`update(from:)`:当视图的属性或状态发生变化时,更新视图。
*`animation(_:)`:将动画应用于视图的更新。
6.销毁
*`deinit`:视图从内存中移除时调用,释放任何占用的资源。
生命周期图
SwiftUI视图生命周期的可视化表示如下:
```
┌──────────────────────────────────────────────────────┐
││
│Initialization│
││
└──────────────────────────────────────────────────────┘
↑
│
│
↓
┌──────────────────────────────────────────────────────┐
││
│Creation│
││
└──────────────────────────────────────────────────────┘
↑
│
│
↓
┌──────────────────────────────────────────────────────┐
││
│Layout│
││
└──────────────────────────────────────────────────────┘
↑
│
│
↓
┌──────────────────────────────────────────────────────┐
││
│Presentation│
││
└──────────────────────────────────────────────────────┘
↑
│
│
↓
┌──────────────────────────────────────────────────────┐
││
│Update│
││
└──────────────────────────────────────────────────────┘
↑
│
│
↓
┌──────────────────────────────────────────────────────┐
││
│Destruction│
││
└──────────────────────────────────────────────────────┘
```
生命周期管理
SwiftUI自动管理视图的生命周期,开发者无需手动处理。通过使用`State`和`@ObservedObject`等属性包装器,SwiftUI可以在属性或状态发生变化时自动触发更新。
自定义生命周期
尽管SwiftUI自动管理生命周期,但开发人员可以通过以下方式自定义某些阶段:
*初始化:覆盖`init(frame:)`方法以控制视图的初始状态。
*创建:在`_makeView(context:)`方法中创建自定义本机视图。
*更新:重写`update(from:)`方法以实现自定义更新逻辑。
*销毁:在`deinit`方法中释放任何资源或执行任何必要的清理。
自定义生命周期对于处理复杂的行为或与底层平台进行交互非常有用。然而,它需要深入了解SwiftUI的内部工作原理,并且应谨慎使用。第二部分视图布局与尺寸计算关键词关键要点【视图布局与尺寸计算】
主题名称:约束布局
1.使用约束布局定义视图之间的空间关系,从而控制它们的布局。
2.约束类型包括距离约束(例如边缘距约束)、比例约束和角度约束。
3.优先级和激活状态可用于控制约束的应用顺序和重要性。
主题名称:尺寸优先级
视图布局与尺寸计算
视图布局和尺寸计算在SwiftUI中至关重要,它们决定了用户界面如何呈现给用户。SwiftUI提供了多种方法来控制视图的布局和大小。
布局优先级
布局优先级决定当多个视图争夺同一空间时如何分配空间。每个视图都有一个默认布局优先级,可以根据需要进行调整。较高的优先级意味着视图将获得更多可用空间。
LayoutPriority枚举
SwiftUI提供了LayoutPriority枚举,它定义了预定义的优先级值:
*required:最高优先级,视图将始终获得其请求的空间。
*defaultHigh:高优先级,视图通常会获得其请求的空间。
*defaultLow:低优先级,视图通常不会获得其请求的空间。
*fittingSizeLevel:视图将仅获得所需的最小空间。
可以通过给视图分配LayoutPriority值来调整布局优先级。
框架与大小
视图具有框架和大小属性。框架是视图在屏幕上的矩形区域,而大小是视图内容的固有尺寸。框架和大小可以通过以下方式进行设置:
*frame(width:height:alignment:):使用指定的宽度、高度和对齐方式设置视图的框架。
*size(width:height:):设置视图的固有大小。
内边距和间距
内边距和间距可以用来在视图周围和视图之间添加空间。
*padding():在视图周围添加内边距。
*padding(edges:amount:):在视图的特定边缘添加内边距。
*spacing():在视图之间添加间距。
对齐与分布
视图可以使用各种对齐和分布选项进行对齐。
*alignmentGuide():将视图内容对齐到指定的指南。
*frame(maxWidth:maxHeight:alignment:):使用指定的对齐方式设置视图的框架。
*HStack和VStack:水平和垂直堆叠视图,并提供不同的对齐选项。
尺寸读取
SwiftUI提供了sizeThatFits(_:)方法,它允许视图根据内容确定其理想大小。可以通过以下方式使用此方法:
*body(content:width:height:):在视图构建器中提供自定义大小。
*background(alignment:content:):在视图后面添加自定义大小的背景。
练习
为了练习视图布局和尺寸计算,请尝试以下练习:
*为两个文本视图设置布局优先级,让一个视图始终占据更多空间。
*使用内边距在视图周围添加空间。
*使用对齐方式将视图对齐到屏幕中心。
*使用尺寸读取确定动态视图大小。
结论
理解SwiftUI中的视图布局和尺寸计算对于创建灵活且美观的界面至关重要。通过利用布局优先级、框架和大小、内边距和间距、对齐和分布以及尺寸读取,开发者可以完全控制其应用程序的用户界面外观和行为。第三部分数据绑定与状态管理数据绑定
*概念:数据绑定是一种双向通信机制,允许视图中的UI元素与底层数据源保持同步。当数据源发生变化时,视图会自动更新,反之亦然。
*实现方式:使用`@State`和`@Binding`属性包装器,将视图中的属性与数据源中的值连接起来。
*优点:简化了视图开发,消除了手动管理状态的需要。
状态管理
*概念:状态管理涉及跟踪和更新视图中变化的数据。
*工具:
*@State:用于跟踪视图私有状态变量。
*@StateObject:用于跟踪和管理视图外部的可观察对象,例如数据模型。
*@EnvironmentObject:用于访问从父视图继承的可观察对象。
*@ObservedObject:用于监听其他视图的可观察对象。
*Combine框架:提供强大的数据处理功能,包括发布者和订阅者模式。
*原则:
*将状态保持在视图的最低层级。
*谨慎使用共享状态。
*遵循单向数据流原则。
*单向数据流:确保数据只能从父视图流向子视图,以避免状态混乱。
*可观察对象:
*概念:观察者模式的一个实现,允许对象监听其他对象的更改并做出反应。
*使用:创建自定义可观察对象来封装数据和业务逻辑,并通过`@ObservedObject`属性包装器在视图中访问。
*数据流:
*父视图持有一个可观察对象。
*子视图使用`@ObservedObject`属性包装器订阅可观察对象。
*当可观察对象中的数据更改时,子视图会自动更新。
高级状态管理
*场景委托:用于管理场景生命周期并储存跨场景状态。
*环境变量:提供一种在视图层次结构中共享数据的机制。
*托管对象上下文:在CoreData中管理持久数据的对象。
*Flux架构:一种单向数据流架构,将数据源、操作和视图分离。第四部分自定义视图修改规则关键词关键要点【ViewBuilders构建自定义视图】
1.SwiftUI中的`ViewBuilder`提供了一种灵活的方式来构建自定义视图,允许创建复杂和嵌套的视图层级。
2.`ViewBuilder`是一个闭包类型,可以使用SwiftUI的声明式语法来构建视图,并支持条件渲染和循环。
3.`ViewBuilder`允许将视图作为参数传递,从而促进代码重用性和模块化。
【属性包装器】
自定义视图修改规则
在SwiftUI中,修改规则定义了视图在数据更改时应如何更新。这允许您控制更新的粒度,从而提高应用程序的性能和效率。
@State
@State修饰符用于存储视图状态。当@State变量更改时,包含该视图的视图层次结构将重新渲染。
@Binding
@Binding修饰符用于在视图和父视图之间建立双向绑定。当其中一个视图更新时,另一个视图将相应更新。
@EnvironmentObject
@EnvironmentObject修饰符用于访问环境对象。环境对象在视图层次结构中被共享,并且当它们更改时,使用它们的视图将重新渲染。
@ObservedObject
@ObservedObject修饰符用于监听可观察对象。当可观察对象更改时,使用它们的视图将重新渲染。
@StateObject
@StateObject修饰符用于创建视图自己的可观察对象。当可观察对象更改时,包含该视图的视图层次结构将重新渲染。
视图修改规则对比
|修改规则|触发更新|更新范围|性能效率|
|||||
|@State|视图状态更改|当前视图|最高|
|@Binding|视图或父视图状态更改|涉及绑定的视图|中等|
|@EnvironmentObject|环境对象更改|使用环境对象的视图|最低|
|@ObservedObject|可观察对象更改|使用可观察对象的视图|中等|
|@StateObject|视图自己的可观察对象更改|视图及其子视图|最低|
选择正确的修改规则
选择正确的修改规则取决于以下因素:
*更新频率:需要的更新频率。
*更新范围:需要更新的视图范围。
*性能开销:修改规则对应用程序性能的影响。
最佳实践
*尽可能使用@State:对于频繁更新且仅影响当前视图的状态,使用@State。
*谨慎使用@Binding:需要在视图之间共享状态时,使用@Binding。避免过度使用,因为它会增加复杂性和性能开销。
*仅在必要时使用@EnvironmentObject:在大量视图需要访问同一数据时,使用@EnvironmentObject。避免将其用于非必要更新。
*使用@ObservedObject/StateObject跟踪异步状态:对于需要在异步操作完成后更新视图的状态,使用@ObservedObject或@StateObject。
*优化性能:通过使用@State而不是@Binding,以及仅在需要时使用修改规则,来优化性能。第五部分可访问性与用户交互关键词关键要点【可访问性与用户交互】
1.确保所有用户,包括残障用户,都可以访问您的应用程序。这包括提供可访问的文本、图像和交互元素。
2.使用SwiftUI中的内置可访问性功能,例如AccessibilityContainer和AccessibilityTraits,以轻松创建可访问的界面。
3.测试您的应用程序的可访问性,并向残疾人征求反馈,以确保您的应用程序符合他们的需求。
【用户交互】
可访问性与用户交互
可访问性
*ARIA属性:使用ARIA(无障碍富互联网应用程序)属性为屏幕阅读器提供有关可访问性元素的信息,例如标签、角色和状态。
*语义元素:使用语义HTML元素,如`<h1>`和`<button>`,以提供明确的语义信息,屏幕阅读器可以理解。
*焦点管理:确保用户可以轻松地在视图元素之间导航,并提供明确的键盘焦点指示。
*颜色对比度:满足可访问性准则,以确保文本、按钮和其他控件具有足够的颜色对比度,易于阅读。
用户交互
手势识别:支持常见的iOS手势,例如轻触、长按、拖动和捏合,以提供直观的交互。
*ViewModifier:使用`ViewModifier`扩展视图,添加自定义手势处理程序和交互行为。
*AccessibilityTraits:使用`AccessibilityTraits`枚举来指定视图的特定特性,例如是否可被双击或是否可拖动。
键盘交互:
*TextEditor:使用`TextEditor`组件提供可编辑文本字段,并支持键盘导航和文本格式化。
*KeyboardShortcuts:定义键盘快捷键,以提供快速访问常见操作。
*响应器链:管理键盘焦点在视图元素之间的流动,允许用户通过Tab键或方向键导航。
语音输入:
*SFSpeechRecognizer:集成`SFSpeechRecognizer`框架,将语音输入转换为文本,允许用户使用语音与应用程序交互。
*语音控制:支持iOS的语音控制功能,允许用户通过语音命令与应用程序交互。
辅助功能配置:
*环境变量:使用`@Environment`属性访问环境变量,以检测辅助功能设置,并相应地调整应用程序的行为。
*辅助功能框架:使用`UIAccessibility`框架来获取有关当前设备辅助功能设置的信息。
*动态类型:支持动态类型,允许用户调整文本大小,以适应他们的视觉偏好。
通过遵循这些可访问性和交互准则,SwiftUI开发人员可以创建包容性和用户友好的应用程序,让所有用户都能轻松访问和使用应用程序。第六部分绘图和动画效果关键词关键要点【自定义图形绘制】
1.使用SwiftUI中的Path和Shape协议创建复杂几何形状,实现自定义图形绘制。
2.利用内建的Shape类型,如Rectangle、Ellipse和Circle,作为绘制基础,并通过组合和修改来创建更复杂的形状。
3.借助PathAPI,通过移动到(moveTo)、添加直线(addLineTo)和添加曲线(addCurveTo)等方法,绘制自定义路径。
【动画效果】
绘图和动画效果
SwiftUI提供了一个强大的绘图API,允许开发者创建自定义形状、路径和动画。
形状
形状是在SwiftUI中绘制对象的通用方式。形状可以是简单形状(如圆形或矩形)或更复杂的定制形状。开发者可以使用`Shape`协议定义自定义形状,该协议要求实现一个`path(in:)`方法,该方法返回一个`Path`,描述形状的几何形状。
Paths
路径是一系列线段和曲线,可以用来表示任意形状。它们由`Path`结构表示,它提供了一组方法来构建和操作路径。开发者可以使用`Path`的以下方法来创建和修改路径:
*`move(to:)`:将路径的当前点移动到指定点。
*`addLine(to:)`:从当前点到指定点添加一条直线段。
*`addQuadCurve(to:control:)`:添加一条二次曲线段,从当前点到指定点,并使用指定的控制点。
*`addCurve(to:control1:control2:)`:添加一条三次曲线段,从当前点到指定点,并使用指定的控制点。
绘制
要绘制一个形状,开发者可以使用`stroke()`或`fill()`方法。`stroke()`方法在形状的轮廓周围绘制一条线,`fill()`方法填充形状的内部。这两种方法都接受`Color`或`LinearGradient`等填充类型的参数。
动画
SwiftUI提供了强大而简单的动画系统。开发者可以使用`withAnimation()`修饰符来为属性添加动画效果。`withAnimation()`修饰符接受一个动画参数,该参数定义动画的持续时间、延迟时间和缓动函数。
开发人员可以使用以下类型的动画:
*显式动画:显式动画需要明确指定要动画化的属性。这可以通过在属性后面添加`animation()`修饰符来实现。
*隐式动画:隐式动画会在状态发生变化时自动应用于属性。
复杂形状的绘制
对于复杂形状,开发者可以使用`GeometryReader`视图来访问视图的几何形状。`GeometryReader`提供了一个`frame(in:)`修饰符,该修饰符返回一个`CGRect`,表示视图在父视图中的位置和大小。开发者可以使用`frame(in:)`修饰符来计算自定义形状的坐标。
自定义转换
SwiftUI还允许开发者使用`transformEffect(anchor:)`修饰符将自定义转换应用于视图。`transformEffect(anchor:)`修饰符接受一个变换矩阵作为参数,该矩阵定义要应用于视图的变换。开发者可以使用此修饰符创建旋转、缩放和平移等效果。
高级绘图技术
SwiftUI还提供了更高级的绘图技术,例如:
*MetalAPI:MetalAPI允许开发者直接访问GPU,以获得最佳的绘图性能。
*自定义渲染器:自定义渲染器允许开发者创建自己的渲染管道,以完全控制绘图过程。
*场景图:场景图是一种分层数据结构,用于表示和管理3D场景。
这些高级技术为开发者提供了创建复杂和交互式绘图和动画效果的强大工具。第七部分环境对象与依赖注入环境对象与依赖注入
概述
在SwiftUI中,依赖注入是一个过程,通过该过程可以将依赖项(如服务、数据模型和数据存储)传递给视图而无需显式创建和传递它们。这可以通过两种机制实现:
*环境对象
*观察者模式
环境对象
环境对象是一种可观察的对象,可以在视图层次结构中任何地方访问。它允许视图订阅对该对象的更改,并根据需要更新其界面。
要使用环境对象,需要定义一个环境关键路径,用于在整个视图层次结构中识别对象。然后,任何视图都可以通过使用`EnvironmentObject`协议访问该对象。
```swift
@EnvironmentObjectvaruserSettings:UserSettings
```
`userSettings`变量现在可在视图中使用。每次`userSettings`发生更改时,视图都会自动更新。
好处:
*简化了依赖项管理
*避免了手动传递依赖项的需要
*促进代码的可测试性
观察者模式
观察者模式是一种设计模式,允许对象订阅其他对象的更改。在SwiftUI中,观察者模式可用于传递依赖项,而不使用环境对象。
要使用观察者模式,需要定义一个`ObservableObject`,它是一个包含可观察属性的对象。然后,任何视图都可以通过使用`@ObservedObject`属性包装器订阅该对象。
```swift
@ObservedObjectvaruserSettings:UserSettings
```
`userSettings`变量现在设置为可观察对象。每次`userSettings`的可观察属性发生更改时,视图都会自动更新。
好处:
*提供了对依赖项变更行为的更细粒度控制
*允许视图选择性地订阅特定属性更改
*可以在单元测试中隔离视图和依赖项
比较
环境对象和观察者模式都是传递依赖项的有效机制。以下是对这两者比较的总结:
|特征|环境对象|观察者模式|
||||
|访问范围|视图层次结构中的所有视图|只有订阅视图|
|控制粒度|较低|较高|
|测试简便性|更简单|稍复杂|
最佳实践
选择适合特定应用程序需求的依赖项传递机制至关重要。一些最佳实践包括:
*对于全局依赖项,请优先使用环境对象。
*对于特定于视图或视图组的依赖项,请使用观察者模式。
*避免过度使用依赖项,因为这会增加复杂性和维护成本。
*尽可能使用轻量级依赖项,以避免性能开销。第八部分高级视图容器关键词关键要点数据填充和绑定
*通过`@State`和`@Binding`声明数据源,并使用`onReceive`监听更新。
*使用`ForEach`和`List`循环显示数据,并使用`Text`和`Image`等控件进行呈现。
*实现双向数据绑定,允许用户交互并更新数据源。
条件渲染
*使用`if`语句或`@ViewBuilder`来基于条件显示或隐藏视图。
*通过`grouped`Modifier按某个键分组数据,并在子视图中进行细分。
*利用`Section`和`HStack`构建可扩展和可折叠的列表。
视图修改器
*使用`foregroundColor`、`backgroundColor`和`opacity`修改视图的外观。
*应用`cornerRadius`、`padding`和`shadow`来添加视觉效果和排版。
*叠加多个修改器来创建复杂且自定义的外观。
手势侦测
*添加`onTapGesture`、`onLongPressGesture`和`onDragGesture`以响应用户输入。
*使用`gesture`Modifier来定义自定义手势识别器。
*通过`simultaneousGesture`和`exclusiveGesture`控制多个手势之间的交互。
动画
*使用`withAnimation`Modifier添加简单的动画效果,如淡入淡出或移动。
*利用`Animation`对象控制动画持续时间、延迟和弹跳。
*实现SpringAnimation以模拟现实世界中的物理交互。
Accessibility
*使用`accessibilityLabel`和`accessibilityHint`描述视图的用途和功能。
*提供辅助功能,例如语音控制和屏幕阅读器支持。
*遵从WCAG准则,确保视图对所有用户,包括残障人士,都是可访问的。高级视图容器
SwiftUI提供了多种高级视图容器,用于组织和管理更复杂的视图层次结构。这些容器包括:
1.HStack(水平堆栈)和VStack(垂直堆栈):
HStack和VStack是最基本的容器,用于在水平或垂直方向排列视图。它们提供灵活的间距和对齐选项,使其适用于创建导航栏、工具栏和其他简单的布局。
2.ZStack:
ZStack允许视图重叠,根据它们的Frame和Alignment属性决定视图的层级。ZStack特别适用于需要创建浮动元素或模态对话框等复杂布局的情况。
3.ScrollView
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 施工机械租赁合同范本
- 气象、水文仪器及装置项目效益评估报告
- 协同进化与生物多样性的形成同步课时训练-2023-2024学年高一下学期生物人教版必修二
- 检验科标本溢洒考试题
- 春人教版五年级数学下册第二单元教案
- 四年级上册数学教案教案已改
- 山东省聊城市东昌府区孟达外国语联考2023-2024学年八年级下学期4月期中考试数学试题
- 道路竣工验收情况总结报告
- 四年级上册英语教案-Unit 1 Again please 冀教版
- 中小学2024年《安全生产月》活动方案
- 喷塑工艺流程说明
- 脑出血业务学习
- 户口本翻译件标准模板
- 2021年青岛版数学九年级下册7.4《圆锥的侧面展开图》同步练习卷(含答案)
- 北师大四年级下期英语期末试卷
- 项目范围管理试题85道
- 关于市城市报警与监控系统建设工作情况的调研报告
- 公司董事会决议检查督办办法
- 新能源车安装充电桩物业证明
- 幼儿园大班教案《赶小猪》含反思
- 浅谈大学生社会责任感的培养_德育论文
评论
0/150
提交评论