1、推出视图的两种方式:
 1.通过导航控制器push到下一个界面,使用pop返回到上一个界面

2.通过模态的形式推出视图,不需要依赖于导航控制器,通过使用present到下一个界面,通过dismiss返回到上一个界面

 如何选择使用哪种视图的推出方法?

秘诀:看视图之间的依赖关系

 1.当下一个页面要展示的数据依赖于上一个界面使用push

 2.当上一个界面依赖于下一个界面的数据时使用present
2、当前一个界面要展示的数据,依赖于后一个界面时,此时使用模态的形式推出视图,模态:是一种新的视图推出方式
图片素材:  
   
通讯录实战所需素材: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];

}
添加联系人效果:

——————————————————————————————
详情界面:与上面添加联系人界面大同小异
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];

}
详情界面编辑效果:

————————————————————————————————————
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];

}
——————————————————————————————————
欢迎学习本文,未经许可,禁止转载!

实战项目:通讯录&nbsp;UI—第十一天的更多相关文章

  1. .NET Core实战项目之CMS 第十一章 开发篇-数据库生成及实体代码生成器开发

    上篇给大家从零开始搭建了一个我们的ASP.NET Core CMS系统的开发框架,具体为什么那样设计我也已经在第十篇文章中进行了说明.不过文章发布后很多人都说了这样的分层不是很合理,什么数据库实体应该 ...

  2. .NET Core实战项目之CMS 第十三章 开发篇-在MVC项目结构介绍及应用第三方UI

    作为后端开发的我来说,前端表示真心玩不转,你如果让我微调一个位置的样式的话还行,但是让我写一个很漂亮的后台的话,真心做不到,所以我一般会选择套用一些开源UI模板来进行系统UI的设计.那如何套用呢?今天 ...

  3. .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

    作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9977862.html 写在前面 千呼万唤始出来,首先,请允许我长吸一口气!真没想到一份来自28岁老程序员 ...

  4. android经典实战项目视频教程下载

    注:这是一篇转载的文章,原文具体链接地址找不到了,将原文分享如下,希望能对看到的朋友有所帮助! 最近在学习android应用方面的技术,自己在网上搜集了一些实战项目的资料,感觉挺好的,发布出来跟大伙分 ...

  5. vue+websocket+express+mongodb实战项目(实时聊天)

    继上一个项目用vuejs仿网易云音乐(实现听歌以及搜索功能)后,发现上一个项目单纯用vue的model管理十分混乱,然后我去看了看vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜 ...

  6. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/9985451.html 本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新 ...

  7. .NET Core实战项目之CMS 第十章 设计篇-系统开发框架设计

    这两天比较忙,周末也在加班,所以更新的就慢了一点,不过没关系,今天我们就进行千呼万唤的系统开发框架的设计.不知道上篇关于架构设计的文章大家有没有阅读,如果阅读后相信一定对架构设计有了更近一部的理解,如 ...

  8. Web项目开发介绍及实战项目介绍

    引言 本系列课程我们将学些Golang语言中的Web开发框架Iris的相关知识和用法.通过本系列视频课程,大家能够从零到一经历一个完整项目的开发,并在课程中了解实战项目开发的流程和项目设涉及的各个模块 ...

  9. react实战项目-很适合进阶

    前言 前段时间学习完了React的基础,自己网上找了一些实战项目,做了几个感觉项目不是很全面,就想做一个完整的项目来提升自己的React水平.以前学习Vue的时候,就看过bailicangdu大神的v ...

随机推荐

  1. 离线合成联想到的--canvas合成水印

    前段时间做了功能模块:用户设置自定义勋章: 实现方式:前端把用户设置的昵称传到后台,后台根据不同用户等级,使用离线合成技术合成不同的勋章返回到前端: 方案算是实现了,但是有点坑就是,后台的离线合成没有 ...

  2. moment.js常用时间示例,时间管理

    '今天': moment() '昨天': moment().subtract(1, 'days') '过去7天':moment().subtract(7, 'days'),moment() '上月': ...

  3. 转:Xming + PuTTY 在Windows下远程Linux主机使用图形界面的程序

    一.原理Linux/Unix的X Window具有网络透明性.X Window系统里有一个统一的Server来负责各个程序与显示器.键盘和鼠标等输入输出设备的交互,每个有GUI的应用程序都通过网络协议 ...

  4. 04_Struts2标签

    1.通用标签: property标签: 用来输出值栈属性的值 如果value属性没有给出,ValueStack值栈栈顶对象的值被输出 许多情况下,EL表达式可以提供更简洁的语法 url标签: url方 ...

  5. Docker常见仓库CentOS

    CentOS 基本信息 CentOS 是流行的 Linux 发行版,其软件包大多跟 RedHat 系列保持一致. 该仓库提供了 CentOS 从 5 ~ 7 各个版本的镜像. 使用方法 默认会启动一个 ...

  6. 为什么内部类访问的外部变量需要使用final修饰

    因为生命周期的原因.方法中的局部变量,方法结束后这个变量就要释放掉,final保证这个变量始终指向一个对象.首先,内部类和外部类其实是处于同一个级别,内部类不会因为定义在方法中就会随着方法的执行完毕而 ...

  7. IntelliJ Idea 设置 Dialyzer

    IntelliJ Idea 设置 Dialyzer(金庆的专栏)Erlang开发使用IDEA IDE可以设置外部工具Dialyzer, 然后就可以直接Tools->External Tools ...

  8. static修饰符详解

    static表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static ...

  9. Linux 高性能服务器编程——TCP协议详解

    问题聚焦:     本节从如下四个方面讨论TCP协议:     TCP头部信息:指定通信的源端端口号.目的端端口号.管理TCP连接,控制两个方向的数据流     TCP状态转移过程:TCP连接的任意一 ...

  10. RxJava操作符(08-条件和布尔操作)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51671826 本文出自:[openXu的博客] 目录: All Amb Contains D ...