swift ClassNameFromString 的替换方法 + 创建TableviewHelper
1. ClassNameFromString 的方法oc 可以正常使用,但是swift 不能直接使用的,下面的代码
func getAPPName() -> String?{
let nameKey = "CFBundleName" //或用 "CFBundleExecutable"
guard let appName = Bundle.main.object(forInfoDictionaryKey: nameKey) as? String else {
return nil;
}
return appName
}
func getClassNameFromeString(_ classString :String)->AnyClass?{
guard let nameSpage = getAPPName() else {
print("没有命名空间")
return nil;
}
guard let childClass = NSClassFromString(nameSpage + "." + classString) else {
print("没有获取到对应的class")
return nil;
}
guard let childType = childClass as? UITableViewCell.Type else {
print("没有得到的类型")
return nil;
}
return childType.self;
}
2.利用这个方法,实现 tableview 简单的助理类
class TableViewHelper : NSObject ,UITableViewDataSource,UITableViewDelegate {
var rowHeight:CGFloat?
var cellForRow :((_ :UITableView,IndexPath)->UITableViewCell)?
var heightForRow :((_ :IndexPath)->CGFloat)?
var cellWillDisplay :((_ :UITableViewCell,IndexPath)->Void)?
var selectRow :((_ :IndexPath)->Void)?;
func addTableHeplerWith(tableView:UITableView,cellIdentArray:[(cellClass:String,cellIdent:String,isNib:Bool)]) ->Void{
self.t_tableView = tableView;
self.t_cellIdentArray = cellIdentArray;
self.initSettings();
}
func reloaTableView(modelArray:[Any]) -> Void {
t_models = modelArray;
t_tableView?.reloadData();
}
//**************** 私有 方法变量 分割线 ****************//
private lazy var t_models :[Any] = {
return [Any]();
}()
private lazy var t_cellIdentArray : [(cellClass:String,cellIdent:String,isNib:Bool)] = {
return [(cellClass:String,cellIdent:String,isNib:Bool)]();
}();
private var t_tableView : UITableView?
private func initSettings()->Void{
t_tableView?.delegate = self;
t_tableView?.dataSource = self;
for tuple in t_cellIdentArray{
if tuple.isNib == false {
let cellClassName = getClassNameFromeString(tuple.cellClass) as! UITableViewCell.Type;
t_tableView?.register(cellClassName, forCellReuseIdentifier: tuple.cellIdent);
}else{
t_tableView?.register(UINib.init(nibName: tuple.cellClass, bundle: nil), forCellReuseIdentifier: tuple.cellIdent);
}
}
}
// tableView dataSource method
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return t_models.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell{
if cellForRow != nil {
return cellForRow!(tableView,indexPath);
}else{
print("tableView 调用不到对应的 cell");
return UITableViewCell();
}
}
//tableView delegate method
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{
if heightForRow != nil {
return heightForRow!(indexPath);
}
if rowHeight != nil {
return rowHeight!
}
return ;
}
func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath){
if cellWillDisplay != nil {
return cellWillDisplay!(cell,indexPath);
}
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
tableView.deselectRow(at: indexPath, animated: true);
if selectRow != nil {
selectRow!(indexPath);
}
}
}
使用这个助理
let tableView = UITableView();
let helper = TableViewHelper(); func prepareHelperAction() -> Void { var cellIdents:[(String,String,Bool)];
if is_iPad() { cellIdents = [("CompletedPadCell",completedCellID,false)];
}else{ cellIdents = [("CompletedCell",completedCellID,false)];
} helper.addTableHeplerWith(tableView: tableView, cellIdentArray: cellIdents); helper.heightForRow = { (indexPath) in if is_iPad() {
return
}else{
return
}
} helper.cellForRow = { (table,indexPath) in if is_iPad() { let cell = table.dequeueReusableCell(withIdentifier: self.completedCellID) as! CompletedPadCell;
cell.configCellWithModel(self.models[indexPath.row] );
cell.delegate = self;
cell.indexPath = indexPath;
return cell; }else{ let cell = table.dequeueReusableCell(withIdentifier: self.completedCellID) as! CompletedCell;
cell.configCellWithModel(self.models[indexPath.row] );
cell.delegate = self;
cell.indexPath = indexPath;
return cell;
}
}
} func reloadUI(_ dataModels:[CPModel]) -> Void { if dataModels.count == { let footerView = UIView.init(frame: CGRect(x:,y:,width:self.view.frame.size.width ,height:self.view.frame.size.height * 0.5));
let footerLabel = UILabel.init(frame: CGRect(x:,y:,width:,height:));
footerLabel.text = "未查找到对应的报告";
footerLabel.font = UIFont.boldSystemFont(ofSize: );
footerLabel.textAlignment = .center;
footerLabel.textColor = UIColor.gray;
footerView.addSubview(footerLabel);
footerLabel.center = footerView.center ; tableView.tableFooterView = footerView }else{ self.models = dataModels;
tableView.tableFooterView = UIView.init(frame: CGRect.zero);
} helper.reloaTableView(modelArray: models);
}
cell he cell 的基类
class BaseCell: UITableViewCell {
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
func configCellWithModel(_ model:Any)->Void{
return;
}
}
class CompletedPadCell: BaseCell {
var delegate :CompletedCellDelegate?
var indexPath :IndexPath?
override func awakeFromNib() {
super.awakeFromNib()
}
override func setSelected(_ selected: Bool, animated: Bool) {
super.setSelected(selected, animated: animated)
}
required init?(coder aDecoder:NSCoder) {
super.init(coder: aDecoder)
}
override init(style:UITableViewCellStyle, reuseIdentifier:String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setUpUI();
}
private func setUpUI() {
}override func configCellWithModel(_ model:Any)->Void{
let cellModel = model as? CPModel;
self.acsLabel.text = Int((cellModel?.pri!)!) == ? "ACS":"";
self.nameLabel.text = cellModel?.pat_name
self.sexLabel.text = cellModel?.pat_gender
self.ageLabel.text = cellModel?.pat_age
self.codeLabe.text = cellModel?.sid
self.timeLabel.text = cellModel?.date;
}
swift ClassNameFromString 的替换方法 + 创建TableviewHelper的更多相关文章
- java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合
Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...
- 【Swift学习】Swift编程之旅---方法(十五)
在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...
- iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法
1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...
- android studio学习----Android Studio导入github下载的工程--替换方法
http://www.cnblogs.com/liuling/p/2015-9-16-01.html 这种方法是可行的,主要是先自己创建一个project ,然后把没有的文件夹都复制过去就OK了,特别 ...
- 测试Javacript里的checkbox是否被选中的status和checked的替换方法
测试Javacript里的checkbox是否被选中的status和checked的替换方法,checkbox.checked和checkbox.status的功能一样,注意checkbox.stat ...
- [Java] - 格式字符串替换方法
Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...
- Swift编程语言中的方法引用
由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...
- PHP mkdir 方法 创建 0777 权限的目录问题
php 中使用 mkdir() 方法创建 0777 权限的目录: $path = './Logs/secondCheck/';if(!is_dir($path)){ mkdir($path, 0777 ...
- console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别
我用两种方法来生成img对象,第一种方法是用new方法,第二种方法是用document.createElement方法. var img1 = new Image(); var img2 = docu ...
随机推荐
- python - Flask 基础(1)
这两天稍微接触了一点 Flask 框架,所以分享点基础 1. 配置文件 from flask import Flask app = Flask(__name__) # 使用自定义的配置文件 app.c ...
- [bzoj 3701] Olympic Games (莫比乌斯反演)
题目描述 给出n,m,l,r,modn,m,l,r,modn,m,l,r,mod 表示一个(n+1)∗(m+1)(n+1)*(m+1)(n+1)∗(m+1)的格点图,求能够互相看见的点对个数对modm ...
- LightOJ - 1078-Integer Divisibility(同余)
链接: https://vjudge.net/problem/LightOJ-1078 题意: If an integer is not divisible by 2 or 5, some multi ...
- CGI FastCGI php-FPM 分别是什么
1.CGI协议用于php解析器跟webserver之间的通信(效率低,浪费资源) 2.FastCGI 可以一次性处理多个进程,是CGI的改良版本 3.php-FPM 是FastCGI 的进程管理器(产 ...
- Linux 查看系统配置参数
原文链接:http://www.cnblogs.com/aric2016/p/10971690.html 查看 cpu信息: cat /proc/cpuinfo 查看内存信息: grep MemTot ...
- SIGAI机器学习第一集 机器学习简介
讲授机器学习的基本概念.发展历史与典型应用 大纲: 人工智能简介机器学习简介为什么需要机器学习机器学习的发展历史机器学习的典型应用人工智能主要的公司本课程讲授的算法 机器学习并不是人工智能一上来就采用 ...
- [转]C++重载()(强制类型转换运算符)
在 C++ 中,类型的名字(包括类的名字)本身也是一种运算符,即类型强制转换运算符. 类型强制转换运算符是单目运算符,也可以被重载,但只能重载为成员函数,不能重载为全局函数.经过适当重载后,(类型名) ...
- hadoop(10)---hdfs配置文件详解
以下只是简单的对hdfs(hdfs.site.xml)配置文件做一个简单的说明. <configuration><property><!-- 为namenode集群定义一 ...
- LUA table中函数的调用
1 lua中函数作为表中元素时有三种定义方式 采用‘:’来定义,实际上隐藏了一个形参的声明,这个形参会截获调用函数时的第一个实参并把它赋值给self 2 调用方式,点号和冒号 functb:hello ...
- GO --- 将Reader 或者 ReadCloser 转化为 ReadSeeker
原因: ReadSeeker 封装了Seek()方法,这个方法要求资源的任何位置都能被定位,例如存储在磁盘里文件,你可以随时读取文件的任意位置.而response.Body 是通过TCP连接从网络中读 ...