1.比如每个cell中有一个button,当点击这个button的时候需要知道当前点击的是哪一行
我解决这个问题的方法是:自定义一个cell,继承与UITableViewCell,并为这个cell创建一个协议如下,协议方法中将自己当作参数使用,如下:
@protocol InteractionTableViewCellDelegate
@required -(void)InteractionTableViewCell:(InteractionTableViewCell *)cell;
@end
在Objective-c中(在swift中不存在这个问题)因为代码顺序的问题,你需要在上方加一个@class(苹果写协议的方式),或者你可以使用你习惯的方式。
然后在你的button方法中实现
- (IBAction)onJoinToActivity:(UIButton *)sender {
[self.delegate InteractionTableViewCell:self];
}
最后在你需要实现协议的控制器中,调用便可以了
- (void)InteractionTableViewCell:(InteractionTableViewCell *)cell{
NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
}
2.对于你的项目有类型不同的cell的时候,或者只有一个cell和其他cell不同的时候
我推荐的做法是:(1)你可以使用不同重用标识符,(2)如果只有一个cell不同的时候你可以,根据indexPath,不用到重用队列中去取,可以通过indexPath去取一个cell,比如:
通过不同的方法来获取cell这个方法可以用来解决:cell不同导致的视图混乱的问题,如果很多cell类型不同,你可以选择不同的重用标识符。
3.使用Static TableView Controller遇到的坑
对于在StoryBoard中使用StaticTableViewController处理一些静态页面是很好的选择(我这里静态的意思当cell固定的时候,并不一定内容也要固定)。然后使用StaticTableViewController的坑也不在少数。
(1),如果你想在StoryBoard中使用StaticTabelView,必须使用TableViewController.
(2),在TableViewController中,self.view既是self.tableView,打印self.view和self.tableVIew的结果都为UITableView,但是view的尺寸也是固定不能修改的
(3),在static cell中修改,tableview高度的方法:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
if indexPath.section == 1 && indexPath.row == 3 {
return CGFloat.min
}else {
return super.tableView(tableView, heightForRowAtIndexPath: indexPath)
}
}
看到上面的坑,如果你想在当前界面上面添加一个视图或者控件的话就非常麻烦,所以在这里我问了填这个坑,使用StoryBoard中的一个控件:ContainerView,这样就可以非常简单的解决这个问题了。
使用containerView使StaticTable共存4.关于设置TableView行高的问题
我这里并不会对于cellheight进行高谈阔论,只是一些需要注意的点而已,如果你是固定行高,self.tableView.rowHeight = 50请使用这种方法。如果你是可变行高的话,我建议需要将行高缓存到一个字典中。tableView需要知道高度的和才能确定自己的contentSize。所以在最一开始的时候,tableView会将所有的cell高度算出来,然后再运行当前可见cell的数量的次数。也就是说:比如,你的tableview有10个cell,但是当前可见的cell只有两个,会运行10次函数:
override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
}
然后再运行两次这个函数,所以为了更好的性能有必要对高度进行缓存。记得在适当的时候对这个缓存进行清理。
5.改变tableView的分割线样式
1.可以使用系统的改变分割线样式方法
override func layoutSubviews() {
super.layoutSubviews()
for view in self.subviews{
if view.classForCoder.description() =="_UITableViewCellSeparatorView"{
var viewOther = view as UIView
//这里表示可以对Cell的分割线单独进行隐藏
viewOther.hidden=true
}
}
}
网友评论