1.KVC
Objective-C KVC机制
http://www.cnblogs.com/jy578154186/archive/2013/02/27/2935413.html
key-value-coding键值编码
2.Objective-c的@property 详解
http://www.cnblogs.com/andyque/archive/2011/08/03/2125728.html
推荐做法是NSString用copy,delegate用assign(且一定要用assign,不要问为什么,只管去用就是了,以后你会明白的),非objc数据类型,比如int,float等基本数据类型用
assign(默认就是assign),而其它objc类型,比如NSArray,NSDate用retain
总结一下,如果你自己实现了getter和setter的话,atomic/nonatomic/retain/assign/copy这些只是给编译的建议,编译会首先会到你的代码里面去找,如果你定义了相应的getter和
setter的话,那么好,用你的。如果没有,编译器就会根据atomic/nonatomic/retain/assign/copy这其中你指定的某几个规则去生成相应的getter和setter。
3.数组不能用点语法,数组成员类型是id时,用括号方法。
4.拖动tableView时,程序奔溃,错误提示EXC_BAD_ACCESS
解决办法:把NSArray 的property设置为assign的,改为strong的就可以了。
@property (nonatomic,strong) NSArray *friends;//正确
//@property (nonatomic,assign) NSArray *friends;//错误,拖动tableView,程序奔溃
5.当前view的frame发生改变的时候,重新布局子控件,(用于自定义空间)
//当前view的frame 发生一些改变的时候,就会调用此方法,重新布局内部的子控件
-(void)<span style="background-color: rgb(255, 255, 0);">layoutSubviews</span>{
self.headerButton.frame = self.bounds;
}
6.NSArray是只读的,不能修改其中的对象
header自定义控件,有UILabel的子控件,想要修改子控件的text,不能修改NSArray中的对象。
7.tableViewController常用方法
//隐藏状态栏
-(BOOL)prefersStatusBarHidden{
return YES;
}
//数据源方法,必须实现
//每组的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//每行的cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//数据源方法,可选实现
//tableView的组数
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
//代理方法
//每组的headerView
- (UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
8.代理
<span style="background-color: rgb(255, 255, 255);">1>子类HeaderView的h文件里
@class HeaderView;
@protocol HeaderViewDelegate <NSObject>
-(void)headerView:(HeaderView *)header;
@end
@interface HeaderView : UITableViewHeaderFooterView
@property (nonatomic,assign) id<HeaderViewDelegate> delegate;
@end
2>子类HeaderView的m文件里,在要被监听的事件clickBtn里,用代理方法
-(void)clickBtn{
self.group.isOpen = !(self.group.isOpen);
// 代理方法
NSLog(@"%@",self.class);
if ([self.delegate respondsToSelector:@selector(headerView:)]) {
[self.delegate headerView:self];
}
}
3>父类ViewController的m文件
@interface ViewController ()<HeaderViewDelegate>
.....
@end
//代理方法的实现
-(void)headerView:(HeaderView *)header{
NSLog(@"%s",__func__);
[self.tableView reloadData];//刷新tableView
}</span><pre name="code" class="objc"><span style="background-color: rgb(255, 255, 255);">//在tableView最上面添加一个UIView
-(UIView *) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
HeaderView *header = [HeaderView headerWithTableView:tableView];
//让控制器充当headerView 的代理
</span><span style="background-color: rgb(255, 255, 0);"> header.delegate = self;</span><span style="background-color: rgb(255, 255, 255);">
FriendGroupModule *group = self.friendGroup[section];
header.group = group;
return header;
}
</span>
9.block
blcok
1>子类h文件
typedef void(^HMHeaderViewBlock)(id);
@property (nonatomic, copy)HMHeaderViewBlock block;
2>子类m文件
- (void)nameBtnClick
{
self.group.open = !self.group.open;
if (self.block) {
self.block(self);
}
}
3>父类m文件
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
HMHeaderView *header = [HMHeaderView headerViewWith:tableView];
HMFriendsGroupModel *model = self.friendsArr[section];
// sender 传过来的参数 ^ 是block 象征 {};做相应操作
header.block = ^(id sender){
[tableView reloadData];
NSLog(@"------%@",sender);
};
header.group = model;
return header;
}
10.通知
通知
1>子类m文件
-(void)clickBtn{
self.group.isOpen = !(self.group.isOpen);
//通知,广播
[[NSNotificationCenter defaultCenter] postNotificationName:@"refreshData" object:nil];
}
2>父类m文件
- (void)viewDidLoad {
[super viewDidLoad];
//通知,监听
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshData) name:@"refreshData" object:nil];
}
//通知,监听到事件后,刷新数据
-(void)refreshData{
[self.tableView reloadData];
}
3>父类m文件,通知要销毁
// 这个方法是在控制器销毁的时候调用,销毁通知
- (void)dealloc
{
//非ARC 必须调取这个方法
// [super dealloc];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}