tags: iOS ,TableView,使用问题
说明
这个是一个简单的对TableView的见解,仅仅包括一些基本内容的使用。
TableView 常见于APP的各种领域各种多项可扩展性的页面,同时可以通过TableViewCell,对tableView进行进一步的扩展,使得TableView尽可能的展示更多的内容。
TableView的使用无论对于系统还是用户来说都是最优解,因为TableView很大的程度上节省了系统的开销,让TableViewCell复用,可充分的提升APP的性能,让数据变得有序可寻。利器!让用户在使用APP的时候,更直观的看到数据,用着顺心!
有关于xib实现的TableView
先新建一个关于TableView的工程,然后看需求新建一个新的页面,或者在MainStoryBoard上拖拽一个新的UI页面,然后直接把TableView控件新建到页面上即可。具体的拖拽就不多说了,重点是为什么需要区分于MainStoryBoard拖拽和新建File拖拽?
作为一个工程的整体性来看,无疑是基于故事版(mainStoryBoard)新建比较好,因为整体看起来能知道整个项目的架构,这样有利于后期的维护以及新加入开发人员的二次开发。至于放在一个新的ViewController里,其实也是又优势的,比方说,你需要别人为你完成某一个页面,但是你又不想多一个人对着mainStoryBoard里面瞎搞,这时候就可以让他新建一个ViewController完成tableView的内容,好吧,上面的都是扯淡,最主要的是,这两种方法使用的时候在页面push/present是不一样的!
这部分以后再补充,再扯下去就离题了。
具体的拖拽细节就不多说了,我们来对照图片补充一下功能吧:
可能会有些地方不对😅(⊙﹏⊙)b,但是多试试就知道是怎么回事的了。
至于后续还有很多的选项还会用到,但是能明显的从那一辅助栏里看出来一些继承关系,对于那些设置是相通的:
可以看得出,tableView是基于ScrollView的扩展,然后ScrollView是基于View的扩展。这种现象就好像我们在一个TableView的Cell 里面嵌入一个UIView、UIButton是一样。
有关于纯代码写UITableView
简单的来说就是要new一个View,然后把它add到另一个View上面。不多说,上代码!
import UIKit
class SecViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate {
var mytableView:UITableView!
override func viewDidLoad() {
super.viewDidLoad()
mytableView = UITableView.init(frame: CGRect(x:0,y:20,width:UIScreen.main.bounds.size.width,height:500))
mytableView.rowHeight = 40.0
mytableView.backgroundColor = UIColor.white
mytableView.tableFooterView = UIView.init()
self.view.addSubview(mytableView)
//接收代理
mytableView.delegate = self
mytableView.dataSource = self
// Do any additional setup after loading the view.
}
是的swift3.0版的是这样子的
然后来点Objective-C的
@interface testTableViewController ()<UITableViewDelegate,UITableViewDataSource>{
UITableView *mytableView;
}
@end
@implementation testTableViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
mytableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 500)];
mytableView.rowHeight = 40.0;
mytableView.backgroundColor = [UIColor whiteColor];
[self.view addSubview:mytableView];
mytableView.delegate = self;
mytableView.dataSource = self;
}
很有意思的事情是,在swift3.0里面,如果仅仅接受了这个TableView的Delegate,就会报出错误的** Type 'SecViewController' conform to protocol 'UITableViewDataSource' **,虽然说这个让swift变得非常“安全”,但是也会让初次使用swift的人感到迷茫(尼玛!)。在Objective-C中也会有警告提醒。相对而言这让人避免了一个错误,是真的!这是真的!
TableView Delegate简单的‘三板斧’
所谓最简单的三板斧,包括了:
- cell row number
- UITableViewCell
- didSelected
不多说,先上代码:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 24;
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("选中了:\(IndexPath.row)\n")
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = UITableViewCell.init(style: UITableViewCellStyle.default, reuseIdentifier: "cellIdentifier")
//说起来你也许不信,我在这里被坑了,不然你们可以试下cell.textLabel?.text = "test 数据"(说到底都是安全惹的祸)
cell.textLabel!.text = "test 数据"
//这里同样具备UILabel 的特性可以进一步扩展
cell.textLabel!.textColor = UIColor.blue
cell.textLabel?.textAlignment = .center
/*
此处略去三百种写法!!!
*/
return cell
}
swift 3.0 code
这一段是Objective-C的。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return 24;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentifier"];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cellIdentifier"];
cell.backgroundColor = [UIColor blueColor];
cell.textLabel.text = @"test 数据";
cell.textLabel.textAlignment = NSTextAlignmentCenter;
}
return cell;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
printf("选中了:(index:%ld)\n",(long)indexPath.row);
}
objective-c
关于自定义的Cell
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:SwTableViewCell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifer", for: indexPath) as! SwTableViewCell
cell.titleLab.text = "这里是可以写字的"
cell.titleImage.backgroundColor = UIColor.blue//其实可以放图片,不过我没有!!!!
return cell
}
swift 3.0
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//这里其实很不规范,因为我cell的类的第一个字符居然特么的小写!!!!!!(不过懒得改了!)
mytestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentity" forIndexPath:indexPath];
//我不太像公开关于cell的内容,感兴趣的可以去看一下,后面有彩蛋!
if (cell == nil) {
cell = [[mytestTableViewCell alloc] init];
}
cell.titleImage.backgroundColor = [UIColor greenColor];
return cell;
}
Objective-C
来自远方的cell发回来的Delegate
在多数情况下,我们需要在使用cell的同时,直接把cell里面的东西直接发到主页面中(也就是刚刚说的TableView),这时候最好的就是通过代理的方式实现,原因是因为省事!!!(作为程序猿,我们能有多懒就做多懒!!!)
先看下cell的代码:
import UIKit
protocol SwTableViewCellDelegate {
func touchTheUIimage()
}
class SwTableViewCell: UITableViewCell {
@IBOutlet weak var titleLab: UILabel!
@IBOutlet weak var titleImage: UIImageView!
var delegate:SwTableViewCellDelegate?
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
//这里才是添加手势的地方!!!!!!!!
let touch = UITapGestureRecognizer.init(target: self, action: #selector(touchAcion));
titleImage.addGestureRecognizer(touch);
}
func touchAcion(){
//这里是添加手势达到触控的目的!!
delegate?.touchTheUIimage()
}
swift 3.0
这时候,还需要在主TableView中实现代理协议
//先添加协议
class SecViewController: UIViewController ,UITableViewDataSource,UITableViewDelegate ,SwTableViewCellDelegate{
//////
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:SwTableViewCell = tableView.dequeueReusableCell(withIdentifier: "cellIdentifer", for: indexPath) as! SwTableViewCell
cell.titleLab.text = "这里是可以写字的"
cell.titleImage.backgroundColor = UIColor.blue//其实可以放图片,不过我没有!!!!
cell.delegate = self
return cell
}
//实现协议代理
func touchTheUIimage() {
print("说起来,也是简单")
}
swift 3.0
下面看看Objective-C的
//这下面是在cell的.h文件实现的内容
@protocol tableCellDelegate <NSObject>
@optional
- (void)touchImage;
@end
@interface mytestTableViewCell : UITableViewCell
@property (assign,nonatomic) id<tableCellDelegate> delegate;
///这个是在cell的.m文件里面实现的
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(touchImageAction)];
[_titleImage addGestureRecognizer:touch];
}
- (void)touchImageAction{
if ([_delegate respondsToSelector:@selector(touchImage)]) {
[_delegate touchImage];
}
}
Objective-C
然后需要在TableView的里面实现接收这个协议的代理方法(真是费劲,特么究竟是代理协议还是协议代理?????!!!)
/// 这里是开始的interface
@interface testTableViewController ()<UITableViewDelegate,UITableViewDataSource,tableCellDelegate>
///这里才是添加协议的位置:
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
//这里其实很不规范,因为我cell的类的第一个字符居然特么的小写!!!!!!(不过懒得改了!)
mytestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cellIdentity" forIndexPath:indexPath];
//我不太像公开关于cell的内容,感兴趣的可以去看一下,后面有彩蛋!
if (cell == nil) {
cell = [[mytestTableViewCell alloc] init];
}
cell.delegate = self;
cell.titleImage.backgroundColor = [UIColor greenColor];
return cell;
}
-(void)touchImage{
NSLog(@"这里实现了协议");
}
Objective-C
写到这里感觉好像TableView的基本简单三板斧就差不多了。
至于想要更多的用法,还是需要更深入的去阅读apple的开发API,虽然贼蛋疼,写的也不如一些优秀开源网站那么好,但是还是需要耐心去阅读。
出来混,总是要还的!这不是无间道唬人的,在开发上也是一样的!
当初被你抛弃的知识和基础,最终会在时间的长廊上遇上,然后再次被虐的体无完肤!这不是琼瑶奶奶的小说,这是开发者的宿命!!!如果爱,请深爱❤️