实战项目:通讯录 UI—第十一天

简介:  1、推出视图的两种方式: 1.通过导航控制器push到下一个界面,使用pop返回到上一个界面 2.通过模态的形式推出视图,不需要依赖于导航控制器,通过使用present到下一个界面,通过dismiss返回到上一个界面 如何选择使用哪种视图的推出方法? 秘诀:看视图之间的依赖关系 1.
 1、推出视图的两种方式:
 1.通过导航控制器push到下一个界面,使用pop返回到上一个界面
 2.通过模态的形式推出视图,不需要依赖于导航控制器,通过使用present到下一个界面,通过dismiss返回到上一个界面
 如何选择使用哪种视图的推出方法?
 秘诀:看视图之间的依赖关系
 1.当下一个页面要展示的数据依赖于上一个界面使用push
 2.当上一个界面依赖于下一个界面的数据时使用present
2、当前一个界面要展示的数据,依赖于后一个界面时,此时使用模态的形式推出视图,模态:是一种新的视图推出方式
图片素材:       实战项目:通讯录 <wbr>UI第十一天

通讯录实战所需素材: http://pan.baidu.com/s/1o6nFol8
———————————————————————————————
ContactListTableViewController.m
#import "ContactListTableViewController.h"
#import
"AddContactViewController.h"
#import
"DetailContactController.h"
#import
"CustomCell.h"
#import "Contacter.h"
- (void)viewDidLoad {
    [
super viewDidLoad];
    [
self configureNavigatinControllerBarContent];
}

//配置导航条的内容
- (
void)configureNavigatinControllerBarContent{
   
//设置title
   
self.navigationItem.title = @"通讯录";
   
//设置左边添加联系人按钮
   
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"add_contact"]style:(UIBarButtonItemStylePlain) target:self action:@selector(handleAdd: )];
   
self.navigationItem.leftBarButtonItem = leftItem;
       
//配置导航条的背景颜色
   
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
   
//配置导航条内容的颜色
   
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
   
//修改title的字体颜色
   
NSDictionary *dic = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
   
   
self.navigationController.navigationBar.titleTextAttributes = dic;
   
//右侧导航条为编辑按钮
    self.navigationItem.rightBarButtonItem = self.editButtonItem;
  
}
#pragma mark 添加联系人按钮的方法
- (void)handleAdd: (UIBarButtonItem *)leftItem{
   
NSLog(@"添加联系人");
   
//当前一个界面要展示的数据,依赖于后一个界面时,此时使用模态的形式推出视图,模态:是一种新的视图推出方式
   
//先创建要推出的试图控制器对象
   
AddContactViewController *addVC =[[AddContactViewController alloc]init];
   
   
//给模态出来的视图控制添加导航控制器
   
UINavigationController *navogationVC = [[UINavigationController alloc]initWithRootViewController:addVC];
   
   
//配置模态出现的样式
    navogationVC.
modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
   
   
//UIModalTransitionStyleCoverVertical = 0,
   
//UIModalTransitionStyleFlipHorizontal,
   
//UIModalTransitionStyleCrossDissolve,
   //UIModalTransitionStylePartialCurl
   
    //模态不依赖于导航控制器,所以不需要拿到导航控制器
    [
self presentViewController:navogationVC animated:YES completion:^{
       //推出视图之后要做的一些操作,可以写在这里 
    }];
   
    [addVC
release];
}


- (
void)didReceiveMemoryWarning {
    [
super didReceiveMemoryWarning];
   
// Dispose of any resources that can be recreated.
}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 10;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *idntifer = @"cell";
  
CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:idntifer];
   
if (cell == nil) {
        cell = [[
CustomCell alloc]initWithStyle:(UITableViewCellStyleValue1) reuseIdentifier:idntifer];
    }
   
//准备一个字典,使用给Model对象赋值
   
NSDictionary *dic = @{@"name":@"小韩哥",@"gender'":@"女",@"age":@"18",@"says":@"我爱编程",@"phone":@"7788521",@"imageName":@"1.png"};
//给model类赋值Contecter
   
Contacter *contacter = [[Contacter alloc]init];
    contacter.
name = dic[@"name"];
   
   
//使用KVC赋值
    [contacter
setValuesForKeysWithDictionary:dic];
   
    cell.
photoView.image = contacter.image;
    cell.
nameLabel.text = contacter.name;
    cell.
phoneLabel.text = contacter.phone;
    
//    NSLog(@"%@- %@-%@-%@-%@-%@",contacter.name,contacter.age,contacter.gender,contacter.phone,contacter.says,contacter.image);//打印看是否取到Model数据的value值
    return cell;
}
#pragma mark 点击cell触发事件
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
   DetailContactController *detailVC = [[DetailContactController alloc]init];
    [self.navigationController pushViewController:detailVC animated:YES];
    [detailVC release];
}
//通过代理返回cell的行高
- (
CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
   return 90;
}
——————————————————————————————————
添加联系人:
AddContactViewController.m
#import "AddContactViewController.h"
#import
"CustomView.h"

@interface AddContactViewController ()<</span>UIActionSheetDelegate,UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property(nonatomic,retain)CustomView *aview;
@end

@implementation AddContactViewController
- (
void)dealloc{
   
self.aview = nil;
    [
super dealloc];
}
- (
void)loadView{
   
self.aview = [[CustomView alloc]initWithFrame:[UIScreen mainScreen].bounds];
   
self.view = self.aview;
    [
self.aview release];
}
- (void)viewDidLoad {
    [
super viewDidLoad];
   
self.view.backgroundColor = [UIColor cyanColor];
    [
self configureNavigationBarContent];
   
//调用手势方法
    [
self addTapGesture];
   
}
//给aImageView 视图添加轻拍手势
- (
void)addTapGesture{
   
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap : )];
   
    [
self.aview.aImageView addGestureRecognizer:tap];
    [tap release];
}
//实现轻拍手势的方法
- (
void)handleTap : (UITapGestureRecognizer *)tap{
//添加ActionSheet控件 提示选项框
   
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"拍照" otherButtonTitles:@"从手机中选择", nil];
   
//在当前界面显示actionSheet对象
    [actionSheet
showInView:self.view];
    [actionSheet
release];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickeonAtIndex:(NSInteger)buttonIndex{
   
switch (buttonIndex) {
       
case 0:
           
//拍照
           
NSLog(@"拍照");
            [
self pickerPictureFromCamera];
           
break;
           
case 1:
           
//从相册中读取照片
           
NSLog(@"从相册中读取照片");
            [
self pickerPictureFormPhotoAlbum];
           
break;
       
default:
           
break;
    }
}
//拍照
- (
void)pickerPictureFromCamera{
   
//判断前摄像头是否可以使用
BOOL isCameera = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
//    UIImagePickerControllerCameraDeviceFront  前摄像头
//    UIImagePickerControllerCameraDeviceRear  //后摄像头
   
if (!isCameera) {
       
NSLog(@"没有摄像头可以使用");
       
return;
    }
   
//初始化图片选择控制器对象
   
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
   
//设置图片选择器选取图片的样式
    imagePicker.
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
   
//设置取出来的图片是否允许编辑
    imagePicker.
allowsEditing = YES;
    //设置代理  
    imagePicker.delegate = self;   必须同时遵循 UIImagePickerControllerDelegate,UINavigationControllerDelegate  两个协议
    //把手机相机推出来
    [
self presentViewController:imagePicker animated:YES completion:nil];
    [imagePicker
release];
   }
//从相册中取出相片
- (
void)pickerPictureFormPhotoAlbum{
   
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
   
//设置图片格式
    imagePicker.
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
   
//设置允许编辑
    imagePicker.
allowsEditing = YES;
   
//设置代理
    imagePicker.
delegate = self;
   
    [
self presentViewController:imagePicker animated:YES completion:nil];
    [imagePicker release];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
   
//从字典中取出编辑的key值,对应的照片
   
self.aview.aImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];
   
//自己推出来的自己收回去
    [
self dismissViewControllerAnimated:YES completion:nil];
}
//配置导航条
- (
void)configureNavigationBarContent{
   
self.navigationItem.title = @"添加联系人";
   
//配置导航条背景颜色
   
self.navigationController.navigationBar.barTintColor = [UIColor orangeColor];
   
//配置内容页的渲染颜色
   
self.navigationController.navigationBar.tintColor = [UIColor whiteColor];
   
//配置字体颜色
   
NSDictionary *dic = @{NSForegroundColorAttributeName : [UIColor whiteColor]};
   
self.navigationController.navigationBar.titleTextAttributes = dic;
   
   
//左侧取消按钮
   
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"clsose"] style:(UIBarButtonItemStylePlain) target:self action:@selector(hanlBack : )];
   
   
self.navigationItem.leftBarButtonItem = leftItem;
   
//释放
    [leftItem
release];
   
//右侧保存按钮
   UIBarButtonItem *rightItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"doneR"] style:(UIBarButtonItemStylePlain) target:self action:@selector(handleSave : )];
  self.navigationItem.rightBarButtonItem = rightItem;   
}
#pragma mark 取消按钮的实现
- (void)hanlBack :  (UIBarButtonItem *)item{
   
//返回上一级界面
    [
self dismissViewControllerAnimated:YES completion:nil];
   
}
#pragma mark 保存按钮的实现
- (void)handleSave : (UIBarButtonItem *)item{
   
//保存数据操作
   
//保存数据后同样返回上一个界面

    [
self dismissViewControllerAnimated:YES completion:nil];
}
添加联系人效果:

实战项目:通讯录 <wbr>UI第十一天

——————————————————————————————
详情界面:与上面添加联系人界面大同小异
DetailContactController.m
#import "DetailContactController.h"
#import
"CustomView.h"

@interface DetailContactController ()<</span>UIActionSheetDelegate,UINavigationControllerDelegate,UIImagePickerControllerDelegate>
@property(nonatomic,retain)CustomView *aView;
@end
@implementation DetailContactController
- (
void)dealloc{
   
self.aView = nil;
    [
super dealloc];
}
- (void)loadView{
   
self.aView = [[CustomView alloc]initWithFrame:[UIScreen mainScreen].bounds];
   
self.view = self.aView;
    [self.aView release];
}
//控制self.aView 的交互事件方法
- (
void)closeUserInteractionByBool : (BOOL)isTure{
   
//根据传进来的参数决定self.aView交互是否打开
   
self.aView.userInteractionEnabled = isTure;
   
}
- (void)viewDidLoad {
    [
super viewDidLoad];
   
self.view.backgroundColor = [UIColor whiteColor];
//配置导航条的内容
    [
self configureNavigationBarContent];
   
//进来详情页面先不能编辑
    [
self closeUserInteractionByBool:NO];
   
//调用添加手势的方法
    [self addTapGesture];  
}
 
//添加aImageView添加轻拍手势
- (
void)addTapGesture{
   UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleTap : )];
    [self.aView.aImageView addGestureRecognizer:tap];
    [tap
release];
}
//实现轻拍手势的方法
- (
void)handleTap :  (UITapGestureRecognizer *)tap{
   
UIActionSheet *actionSheet = [[UIActionSheet alloc]initWithTitle:nil delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"拍照" otherButtonTitles:@"从手机中选择", nil];
   
//当前界面显示actionSheet对象
    [actionSheet
showInView:self.view];
    [actionSheet
release];
   
}
- (
void)actionSheet:(UIActionSheet *)actionSheet clickeonAtIndex:(NSInteger)buttonIndex{
   
switch (buttonIndex) {
       
case 0:
            [
self  pickerPictureFromCamera];
           
NSLog(@"没有摄像头可以使用");
           
break;
           
case 1:
            [
self pickerPictureFromPhotoAlbum];
           
break;
       
default:
           
break;
    }
}
//配置导航条的内容
- (
void)configureNavigationBarContent{
   
self.navigationItem.title = @"详情";
   
//左侧配置编辑按钮
   
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"btn_backItem"] style:(UIBarButtonItemStylePlain) target:self action:@selector(handleBack:)];
   
self.navigationItem.leftBarButtonItem = leftItem;
    [leftItem
release];
   
//配置右侧按钮
   self.navigationItem.rightBarButtonItem = self.editButtonItem;
}
//拍照
- (
void)pickerPictureFromCamera{
   
//判断前摄像头是否可以使用
   
BOOL isCamera = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
   
if (!isCamera) {
       
return;
    }
   
//初始化图片是选择器对象
   
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
   
//设置图片选择器选取图片的样式
    imagePicker.
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
   
//设置取出来的图片是否允许编辑
    imagePicker.
allowsEditing  = YES;
   
//设置代理
    imagePicker.
delegate = self;
   
//把手机相机推出来
    [
self presentViewController:imagePicker animated:YES completion:nil];
    [imagePicker release];   
}
//从相册中取相片
- (
void)pickerPictureFromPhotoAlbum{
   
UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
   
//设置图片格式
    imagePicker.
sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
   
//设置是否允许编辑
    imagePicker.
allowsEditing = YES;
   
//设置代理
    imagePicker.
delegate = self;
    [
self presentViewController:imagePicker animated:YES completion:nil];
}
- (
void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
   
//从字典中取出编辑的key值,对应的照片
   
self.aView.aImageView.image = [info objectForKey:UIImagePickerControllerEditedImage];
   
//自己推出来自己收回去
    [self dismissViewControllerAnimated:YES completion:nil];
}
#pragma mark 重写编辑按钮的方法
- (void)setEditing:(BOOL)editing animated:(BOOL)animated{
    [super setEditing:editing animated:animated];
    //调用交互的方法
   
//editing == YES  可以编辑 editing == NO 不可以编辑
    [self closeUserInteractionByBool:editing];
}
//实现back的方法
- (
void)handleBack: (UIBarButtonItem *)back{
    //保存数据的方法
  
    //返回上一个界面
    [
self.navigationController popViewControllerAnimated:YES];
}
详情界面编辑效果:

实战项目:通讯录 <wbr>UI第十一天

————————————————————————————————————
CustomCell 和CustomView  自定义cell和自定义视图布局不做详细介绍!
2、懒加载方法:
CustomCell.h
@property(nonatomic,retain)UIImageView *photoView;
@property(nonatomic,retain)UILabel *nameLabel;
@property(nonatomic,retain)UILabel *phoneLabel;
CustomCell.m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
   
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
       
//布局操作写在这里
        [
self.contentView addSubview:self.photoView];
        [
self.contentView addSubview:self.nameLabel];
        [self.contentView addSubview:self.phoneLabel];     
    }
    return self;
}
//懒加载创建cell上的自定义控件
- (UIImageView *)photoView{
   
if (_photoView == nil) {
       
self.photoView = [[[UIImageView alloc]initWithFrame:CGRectMake(10, 5, 80, 80)]autorelease];
       
self.photoView.layer.cornerRadius = 40.0;
       
self.photoView.layer.masksToBounds = YES;
       self.photoView.backgroundColor = [UIColor brownColor];  
    }
    //添加安全机制
    return [[_photoView retain]autorelease];   注意:系统提供的持有对象有时也会crash所以retain再release更安全!
}
- (UILabel *)nameLabel{
   
if (_nameLabel == nil) {
       
self.nameLabel = [[[UILabel alloc]initWithFrame:CGRectMake(100, 18, 100, 25)]autorelease];
       
self.nameLabel.backgroundColor = [UIColor brownColor];
       
self.nameLabel.layer.cornerRadius = 7;
       
self.nameLabel.layer.masksToBounds = YES;
    }
   
return [[_nameLabel retain]autorelease];
}

- (
UILabel *)phoneLabel{
   
if (_phoneLabel == nil) {
       
self.phoneLabel = [[[UILabel alloc]initWithFrame:CGRectMake(100, 48, 160, 25)]autorelease];
       
self.phoneLabel.backgroundColor = [UIColor brownColor];
       
self.phoneLabel.layer.cornerRadius = 7;
       
self.phoneLabel.layer.masksToBounds = YES;
    }
   
return [[_phoneLabel retain]autorelease];
}
——————————————————————————————————
欢迎学习本文,未经许可,禁止转载!
目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 前端开发
机器学习PAI常见问题之web ui 项目启动后页面打不开如何解决
PAI(平台为智能,Platform for Artificial Intelligence)是阿里云提供的一个全面的人工智能开发平台,旨在为开发者提供机器学习、深度学习等人工智能技术的模型训练、优化和部署服务。以下是PAI平台使用中的一些常见问题及其答案汇总,帮助用户解决在使用过程中遇到的问题。
|
4月前
|
开发框架 前端开发 .NET
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
七天.NET 8操作SQLite入门到实战 - (1)第七天BootstrapBlazor UI组件库引入
|
4月前
|
缓存 自然语言处理 物联网
LLama Factory+ModelScope实战——使用 Web UI 进行监督微调
LLaMA Factory 是一个高效的大语言模型训练和推理框架,它通过提供一站式的 Web UI 界面和集成多种训练方法,简化了大模型的微调过程,并能够适配多种开源模型。
|
8月前
|
Web App开发 前端开发 JavaScript
SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版
SAP UI5 应用开发教程之五十八 - 使用工厂方法在运行时动态创建不同类型的列表行项目控件试读版
36 0
|
3月前
|
中间件
SAP UI5 Tooling 实战:动手创建自己的 Custom UI5 Server Middleware 试读版
SAP UI5 Tooling 实战:动手创建自己的 Custom UI5 Server Middleware 试读版
19 0
SAP UI5 Tooling 实战:动手创建自己的 Custom UI5 Server Middleware 试读版
|
4月前
|
移动开发 开发框架 JavaScript
什么是 SAP UI5 项目 ui5.yaml 文件中的 specVersion 字段
什么是 SAP UI5 项目 ui5.yaml 文件中的 specVersion 字段
18 0
|
5月前
|
C++
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(二)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
45 0
|
5月前
|
算法 关系型数据库 编译器
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目(一)
[项目配置] 配置Qt函数库和ui界面库的封装并调用的项目
73 0
|
7月前
|
小程序 JavaScript 前端开发
【易售小程序项目】项目创建+整合UI组件(FirstUI和uView)
【易售小程序项目】项目创建+整合UI组件(FirstUI和uView)
61 0
|
7月前
|
前端开发
ABAP2UI5 项目里动态创建模型的特性介绍
ABAP2UI5 项目里动态创建模型的特性介绍
32 0