美文网首页
有关于iOS TableView的一些见解

有关于iOS TableView的一些见解

作者: 飛天江郎 | 来源:发表于2017-03-07 23:41 被阅读220次

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

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

相关文章

网友评论

      本文标题:有关于iOS TableView的一些见解

      本文链接:https://www.haomeiwen.com/subject/emvvgttx.html