`
wfkbyni
  • 浏览: 86981 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

一个公共的TableView,然后不会为每个TableView加delegate和datasource

 
阅读更多
.h
//
//  PublicTableView.h
//  JointCrm
//
//  Created by Mac on 15/10/27.
//  Copyright © 2015年 Mac. All rights reserved.
//

#import <UIKit/UIKit.h>

typedef void(^TableBlock)(UITableView *tableView,NSIndexPath *indexPath);

@interface PublicTableView : UITableView

/**
*  定义一个公共的TableView,然后可以在使用tableview的地方使用
*
*  @param frame       UITableView的frame
*  @param style       UITableViewStyle
*  @param className   cell Class
*  @param mcellMethod cell调用的方法
*  @param isUserNib   是否使用nib
*
*  @return cell
*/
-(instancetype)initWithFrame:(CGRect)frame
                       style:(UITableViewStyle)style
           cellWithClassName:(NSString *)className
              cellWithMethod:(NSString *)cellMethod
           cellWithIsUserNib:(BOOL)isUserNib;

// 数据列表
@property (nonatomic, strong) NSMutableArray *dataList;

@property (nonatomic, copy) TableBlock tableBlock;

// 数据行选择时所触发的block
- (void)blockWithCellSelectRowAtIndexPath:(TableBlock)tableBlock;

@end

.m
//
//  PublicTableView.m
//  JointCrm
//
//  Created by Mac on 15/10/27.
//  Copyright © 2015年 Mac. All rights reserved.
//

#import "PublicTableView.h"
#import <objc/objc-runtime.h>

@interface PublicTableView()<UITableViewDataSource,UITableViewDelegate>{
    NSString *cellClassName;
    NSString *cellInvokMethod;
}
@end

@implementation PublicTableView

-(instancetype)initWithFrame:(CGRect)frame style:(UITableViewStyle)style cellWithClassName:(NSString *)className cellWithMethod:(NSString *)cellMethod cellWithIsUserNib:(BOOL)isUserNib{
   
    if (self = [super initWithFrame:frame style:style]) {
       
        self.delegate = self;
        self.dataSource = self;
       
        cellClassName = className;
        cellInvokMethod = cellMethod;
       
        if (isUserNib) {
            [self registerNib:[UINib nibWithNibName:className bundle:nil] forCellReuseIdentifier:className];
        }else{
            [self registerClass:NSClassFromString(className) forCellReuseIdentifier:className];
        }
    }

    return self;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataList.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellClassName forIndexPath:indexPath];
   
    if ([cell respondsToSelector:NSSelectorFromString(cellInvokMethod)]) {
       
        id value = self.dataList[indexPath.row];
       
        [self sendMsg:cell method:NSSelectorFromString(cellInvokMethod) value1:value value2:indexPath];
       
    }else{
        DLog(@"%@",@"cell未实现该方法");
    }
   
    return nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    self.tableBlock(tableView,indexPath);
}

-(void)blockWithCellSelectRowAtIndexPath:(TableBlock)tableBlock{
    self.tableBlock = tableBlock;
}

- (void)sendMsg:(id)rever method:(SEL)method value1:(id)value1 value2:(id)value2{
   
    int (*action)(id, SEL, id, id) = (int (*)(id, SEL, id, id)) objc_msgSend;
   
    action(rever, method, value1, value2);
}

@end

使用:
PublicTableView *publicTableView = [[PublicTableView alloc] initWithFrame:self.view.frame
                                                                        style:UITableViewStylePlain
                                                            cellWithClassName:@"MyCell"
                                                               cellWithMethod:@"cellConfig:"
                                                            cellWithIsUserNib:YES];
   
    [self.view addSubview:publicTableView];
   
    publicTableView.dataList = dataList;
   
    [publicTableView blockWithCellSelectRowAtIndexPath:^(UITableView *tableView, NSIndexPath *indexPath) {
       
    }];


注意:这里只需要把每个cell的类名,及配置数据的方法传进去就可以了
分享到:
评论

相关推荐

    ios-TableView delegate dataSource封装.zip

    这个“ios-TableView delegate dataSource封装.zip”文件显然提供了一个关于如何封装这两个协议的方法,以便在多个UITableView实例中重用代码,避免了每次创建新的表格视图时都需要手动复制和粘贴相同的数据源和代理...

    一个控制器 多个tableview

    2. **设置DataSource和Delegate**:每个TableView都需要自己的DataSource和Delegate,这样它们才能正确显示数据和响应用户交互。由于所有TableView都属于同一个控制器,我们可以让控制器同时担任这些角色。 ```...

    swift-通过链式风格快速为UITableView创建Delegate和DataSource

    首先,我们需要创建一个扩展,这个扩展将添加一个方法到UITableView类,该方法用于设置Delegate和DataSource。这个方法应该返回self,以便可以链式调用其他方法: ```swift extension UITableView { func ...

    一个tableview很好的例子

    在上述代码中,我们首先定义了行数,然后为每一行创建并配置UITableViewCell。当用户点击单元格时,会触发`didSelectRowAt`方法。 压缩包中的文件"RTImageLoader副本"可能是一个用于加载图片的库或组件。在...

    ios-轻松实现两个 TableView的联动.zip

    每个TableView都有自己的DataSource和Delegate,它们分别负责提供数据和处理与用户交互的事件。为了实现联动,我们需要在DataSource中添加逻辑,使得当一个TableView的数据发生变化时,能够同步更新到另一个...

    一个简单的TableVIew

    每个数组元素都将对应TableView中的一个单元格。 4. **实现UITableViewDataSource协议** 必须实现以下方法: - `numberOfSectionsInTableView:`:返回TableView的section数量。 - `tableView:...

    TableView 的使用 实例一

    接着,我们需要为UITableView指定DataSource和Delegate,这两个协议定义了UITableView如何获取和显示数据,以及处理用户交互。 DataSource协议主要有三个方法: 1. numberOfSectionsInTableView: 返回表格中的...

    tableView自定义section和row

    `numberOfSections(in:)`返回tableView的section数量,`tableView(_:numberOfRowsInSection:)`返回指定section内的行数,而`tableView(_:cellForRowAt:)`则用于为每一行创建并配置UITableViewCell。 在自定义...

    横向tableView嵌套纵向tableView

    - 在子类中初始化并配置内部的纵向TableView,设置其DataSource和Delegate为自己。 二、纵向TableView 1. 纵向TableView是每个横向TableViewCell内的子视图,它负责展示每一列中的数据子项。 - 设置内部...

    swift-TableView嵌套CollectionView的一个小Demo

    - 在UITableViewCell的子类中设置UICollectionView的frame、dataSource和delegate为当前的UITableViewCell实例。 3. **设置UICollectionView的布局** - 根据需求定制UICollectionViewFlowLayout,如设置列数、...

    不能滑动的tableView

    然后在`tableView(_:numberOfRowsInSection:)`返回行数,`tableView(_:cellForRowAt:)`中设置每个cell的内容。 5. 响应点击事件:如果需要对tableView中的某一部分进行交互,例如点击跳转到其他页面,可以在`...

    Multiple Columns TableView

    例如,你可以定义一个新的方法来返回每行有多少列,然后在`tableView:cellForRowAtIndexPath:`中根据列数动态调整Cell的宽度。 5. **使用第三方库**:如题目中提到的Xenofex-MultiColumnTableViewForiOS,这是一个...

    TableView详解

    - 配置TableView的数据源和代理,通过连线或者在代码中设置`tableView.dataSource = self`和`tableView.delegate = self`。 2. **数据源方法**: - `numberOfSections(in tableView:)`:返回TableView的section...

    ios-UIScrollView上添加多个TableView.zip

    每个TableView由Sections(分区)和Rows(行)组成,可以与DataSource(数据源)和Delegate(代理)协议配合,实现数据加载和用户交互。 在该示例中,描述提到底部是一个ScrollView,这是整个界面的容器。...

    tableview控件

    `numberOfRowsInSection(_:)`返回特定区(section)内的行数,`tableView(_:cellForRowAt:)`则负责为每个索引路径创建并返回一个单元格。在这个方法中,你将根据数据模型填充单元格的各个部分。 `...

    LightTableView:轻量级tableview 分离delegate datasource cell

    LightTableView 是一个专门为 iOS 开发者设计的轻量级组件,它主要解决了在使用 UITableView 时,delegate 和 dataSource 的职责过于混杂的问题。这个库的目标是通过分离 delegate、dataSource 和 cell,来简化代码...

    横向TableView

    它基于数据源(DataSource)和委托(Delegate)的设计模式,由数据源提供数据,委托处理用户交互。 ### 数据重用机制 - **Cell重用**:为了优化性能,Tableview采用了一种称为“cell重用”的机制。当cell离开屏幕...

    iphone 网格tableview实例

    2. 数据源方法:在数据源协议的实现中,我们需要返回正确的单元格数量(`- tableView:numberOfRowsInSection:`),并为每个单元格提供内容(`- tableView:cellForRowAt:`)。在这里,我们可以根据数据源中的数据来...

    tableview所有属性.rar

    DataSource必须实现的方法包括`numberOfSectionsInTableView:`、`tableView:numberOfRowsInSection:`和`tableView:cellForRowAtIndexPath:`,以定义表格的结构和每个单元格的内容。 2. **Cell自定义**: `...

Global site tag (gtag.js) - Google Analytics