iOS开发脚踏实地学习day09-QQ好友列表

本文介绍了Objective-C中KVC的使用方法、属性声明的最佳实践、数组管理、UITableView的常见问题及解决方案、委托模式的应用、Block和通知机制的实现方式等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值