有关于iOS TableView的一些见解


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,虽然贼蛋疼,写的也不如一些优秀开源网站那么好,但是还是需要耐心去阅读。
出来混,总是要还的!这不是无间道唬人的,在开发上也是一样的!

当初被你抛弃的知识和基础,最终会在时间的长廊上遇上,然后再次被虐的体无完肤!这不是琼瑶奶奶的小说,这是开发者的宿命!!!如果爱,请深爱❤️

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 人们常常都在探讨自由是什么。自由是没有限制,无拘无束吗?自由是可以随心所欲地做自己想做的事情吗?自由是发表自己想发...
    钤鱼摆摆阅读 183评论 0 1
  • 前天,去参加先生高中一同学孩子的升学宴,说是升学宴其实就是一群老同学找机会聚聚而已,毕业三十多年了,除了恋爱结婚时...
    晓晓的窝阅读 518评论 3 3
  • 2015匆匆就过去了,这一年里带给哦哦深刻记忆的词就这些:努力,幸运,感动,感恩。从实习到现在,也一年了,收获真...
    拼pin阅读 164评论 0 0
  • 数据可视化 结论 上一篇文章中,我们说到了如何处理数据,并且最后筛选出比较重要的一些特征。按道理来说,接下来我们应...
    万能滴小笼包阅读 9,150评论 4 7