UI_通讯录实战(模态、单例、需求、框架)
(一)
模态viewController
单例
单例模式
(二)
什么是需求/如何分析需求/如何进行框架设计
模态viewController
介绍
- 程序中切换页面,可以使用UINavigationController。通过导航控制器切换。
- 某种情况下,可以使用视图控制器的一对方法实现切换页面
- presentViewController:animated:completion:展示新的页面
- dismissViewController:Animated:completion:从新的页面返回
- 通过上述方法显示的controller被称为模态视图控制器。
- 注:模态视图控制器不是一个类,只是一种方式显示的controller
使用场景:
- UIImagePickerController。调用系统相册、照相机。
- 临时展示一些内容。例如:程序中用户登录,通讯录中添加联系人
- 导航控制器控制的controller具有层级关系。present控制显示的controller与之前的controller是两个层级
使用方式:
presentViewController:animated:completion:模态显示controller
在controllerA中模态显示controllerB
- presenting view controller =>controllerA
- presented view controller = >controllerB(被弹出的)
dismissViewController:animated:completion: 弹出模态controller
两种实现方式,在模态controller中使用:
- [self dismissViewControllerAnimated:YES completion:nil];
- [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
使用self调用方法,系统会使用self.presentingViewController调用这个方法
属性设置
- modalPresentationStyle 模态controller显示样式
- modalTransitionStyle 模态显示动画样式
单例对象
单例类可以是工具类,视图类,控制器类
使用场景:
- 通讯录的列表页面、添加页面、编辑页面需要同一个数据源,如何提供数据源才更方便操作?
- 导航控制器从firstVC展示到thirdVC,如何将值从firstVC传入thirdVC
使用方法:
- 定义单例类
- 定义创建单例对象的方法(类方法)
- 根据需要实现伪单例或完整单例
@implementation DataHandle
static DataHandle *handle = nil;
//单例类使用此方法,创建单例对象
+ (DataHandle *)shareInstance
{
if(nil == handle) {
//如果没有关键过对象,使用handle指向新创建的对象
handle = [[DataHandle alloc] init];
}
//如果已经创建过对象,则直接返回已经创建的对象
return handle;
}
static DataHandle *handle = nil;
//单例类使用此方法,创建单例对象
+ (DataHandle *)shareInstance
{
if(nil == handle) {
//如果没有关键过对象,使用handle指向新创建的对象
handle = [[DataHandle alloc] init];
}
//如果已经创建过对象,则直接返回已经创建的对象
return handle;
}
注意:
- 操作单例对象的变量存储在静态区,程序关闭后由系统自动回收
- 单例对象存储在堆区,不释放,程序关闭后由系统自动回收
- 变量和单例对象的生命周期与程序同步。
优势:
- 内存中只有一个对象,节省内存空间
- 避免频繁的创建销毁对象,可以提高性能。
- 避免对共享资源的多重占用
- 可以全局访问
- 降低模块之间的耦合度,降低代码的复杂度
单例模式
单例模式是一种设计模式。
实现:定义一个单例类,保证程序中这个类只能创建唯一的实例对象,实现资源共享。
什么是需求
需求:我想做一个xxx样子的App
随着计算机的发展,软件开发引入声明周期后,需求分析成为第一阶段
- 问题的定义及规划(确定用户需要解决的问题,进行可行性分析)
- 需求分析(重要阶段,为项目开发打下良好基础)
- 软件设计(为软件编写打下基础,封装、模块化、低耦合、可维护、可扩展)
程序编码->软件测试->运行维护
如何分析需求
通讯录:
- 注意项目的范围(界面的个数)
- 注意分析项目的逻辑(界面的跳转)
- 注意分析项目的作用(界面的功能)
界面个数:
- 所有联系人列表界面
- 添加联系人界面
- 查看联系人详情界面
界面逻辑:
- 所有联系人列表界面 ->添加联系人信息界面
- 所有联系人列表界面 ->查看联系人详情界面
- 添加联系人信息界面 ->所有联系人列表界面
- 查看联系人详情界面 ->所有联系人列表界面
列表展示:
- 使用tableView展示联系人信息,每个联系人显示头像、姓名、电话
- 使用自定义cell展示每行数据
- 分组展示联系人,设置分区header的title,设置分区索引,所有组按字母顺序排列。
- 页面导航栏右侧设置“编辑”按钮,控制tableView编辑,可以删除数据,注:分区剩一条数据时,删除整个分区
- 页面导航栏左侧设置“添加”按钮,点击使用模态形态展示“添加联系人”页面
- 点击任意联系人,推出详情页面,展示联系人的详细信息。
- 添加按钮:
- 描述:使用模态形式展示“添加联系人”页面
- 实现:presentViewController/buttonItem使用系统样式
- 编辑按钮:
- 描述:控制tableView的编辑状态
- 实现:使用controller的editButtonItem按钮
- 列表展示:
- 描述:使用tableView展示所有联系人基本信息
- 实现:使用UITableViewController
- 分区展示设置:
- 描述:设置分区头(大写字母)/设置分区索引
- 实现:实现两个代理方法
- 删除联系人:
- 描述:删除某个分组中的联系人/删除某个分组
- 实现:实现代理方法
- 自定义cell展示数据:
- 描述:定义新的类型的cell,展示数据
- 展示联系人详情:
- 描述:点击cell,进入“详情页面”
- 实现 :需要将选中行的数据,传入详情页面
MVC
- controller:contactListViewController(UITableViewController)
- view:UITableView(controller自带)ContactListCell
- Model:ContactPerson
详情展示:
- 页面导航栏显示联系人姓名(属性传值)
- 页面内显示:联系人头像,姓名,性别,年龄,联系方式,爱好
添加联系人

如何进行框架设计
项目界面框架步骤:
- 根据项目的界面个数创建相同个数的视图控制器
- 根据项目的界面逻辑创建每个视图控制器上对应的切换方法
- 根据项目的界面功能创建每个视图控制器上对应的功能方法
项目模型框架的设计:
- 根据项目内的界面功能设计程序内需要的数据结构
- 根据项目内的界面内容设计程序内每个视图控制器需要的数据对象
- 根据项目内的界面逻辑设计程序内视图控制器切换过程中需要的参数对象

浙公网安备 33010602011771号