码迷,mamicode.com
首页 > 移动开发 > 详细

iOS开发——UI篇&代理/通知/Block传值(实现UItableView分组的收缩与展开)

时间:2015-07-19 23:04:46      阅读:258      评论:0      收藏:0      [点我收藏+]

标签:

代理/通知/Block传值实现UItableView分组的收缩与展开

 

初始化之后出现下面的界面

技术分享 

 

 

准备:

 

1:定义一个BOOL值用来记录点击

 1 @property (nonatomic, assign, getter = isOpen) BOOL open; 

 

2:在相应的点击方法里面是实现点击

 1 self.group.open = !self.group.open; 

 

3:在numberOfRowsInSection中返回的时候使用三木判断是否点击,并且实现伸缩与展开,

 1 return model.open?model.friends.cout:0; 

 

这里完成之后运行程序点一下试试,你会发现。。。。。。。。。。。。。。。。。什么效果也没有。

当然会没有效果,因为我们没有传值,后面才是本章的重点,学会了这里以后关于通知,代理。Block的使用基本上没有问题。

 

/************************************************代理*************************************************/

方法一:代理

1:在对应的View中创建一个协议

 1 @class iCocosView
 2 
 3  
 4 
 5 @protocol iCocoDelegate <NSObject>
 6 
 7 @optional
 8 
 9 -(void)headerView:(iCocosView *)view;
10 
11  
12 
13 @end

 

2:创建一个代理属性

 1 @property (nonatomic, assign) id<iCocoDelegate> delegate; 

 

3:在这个实现文件中判断有没有实现这个代理方法

1 if([self.delegate repondToSelector:selector(headerView)]) {
2 
3 [self.delegate headerView];
4 
5 }

 

 

4:先在对应的控制器遵守这个协议,并且设置代理

 1 <iCocosDelegate> 

  • header.delegate = self; //让控制器充当代理

 

5:实现代理方法

 1 -(void)headerView:(iCocosView *)view { 2 3 [self.tableView reloadData]; 4 5 }  

 

/************************************************Block*************************************************/

方法二:Block

1:定义一个Block

 1 typedef void (^iCocosBlock)(id);  

2:创建一个Block对应的属性(使用Copy)

 1 @property (nonatomic, weak)iCocosBlock block; 2 3  

3:实现文件中判读

 1 if(self.block) { 2 3 self.block(self); 4 5 }  

4:在控制器中实现

1 header.block = ^(id sender) {  //sender是传过来的参数
2 
3 [self.tableView reloadData];
4 
5 };

 

 

/************************************************通知*************************************************/

方法三:通知

 

1:在控制器中注册一个通知

 1 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notiClick) name:@“friends” object:nil]; 2 3  

2:实现通知方法

1 -(void)notiClick
2 
3 {
4 
5 [self.tableView reloadData];
6 
7 }

 

 

3:同样在实现文件中发布一个通知

 1 [[NSNotificationCenter defaultCenter]postNotificationName: @“friends”object:self userInfo:nil]; 2 3  

4:移除通知:我们可以在两个方法里面一出通知:ViewDidDidApper和Dealloc

并且使用良种两种方法

@1:移除所有通知

 1 [[NSNotificationCenter defaultCenter] removeObserver:self]; 

@2:根据名字移除通知

 1 [[NSNotificationCenter defaultCenter]removeObserver:self name:@“friedns” object:nil];  

这里需要注意:实际开发中使用完通知之后一定要移除通知,否则如果里面通知太多,当你再次发送一个通知的时候程序就不知道去找那个通知甚至会导致程序奔溃。

 

 

 

/************************************************运行结果*************************************************/

 

使用上面任何一种方法都可以实现同样的功能,点击每一行的组的时候就会展开相应行并且显示对应组的所有行。

技术分享

但是具体使用说明视情况而定:

总结:。。。。。。。。待续

 

iOS开发——UI篇&代理/通知/Block传值(实现UItableView分组的收缩与展开)

标签:

原文地址:http://www.cnblogs.com/iCocos/p/4659878.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!