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的更多相关文章

  1. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...

  2. 【Swift学习】Swift编程之旅---方法(十五)

    在Swift中结构体和枚举也能够定义方法,而在 Objective-C 中,类是唯一能定义方法的类型. 实例方法 实例方法是属于某个特定类.结构体或者枚举类型实例的方法,实例方法提供访问和修改实例属性 ...

  3. iOS开发之swift与OC混编出现的坑,oc中不能对swift的代理进行调用,不能访问swift中的代理,swift中的回调方法

    1. Swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解. 2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理? 解决方法如下: 在代理的头部 ...

  4. android studio学习----Android Studio导入github下载的工程--替换方法

    http://www.cnblogs.com/liuling/p/2015-9-16-01.html 这种方法是可行的,主要是先自己创建一个project ,然后把没有的文件夹都复制过去就OK了,特别 ...

  5. 测试Javacript里的checkbox是否被选中的status和checked的替换方法

    测试Javacript里的checkbox是否被选中的status和checked的替换方法,checkbox.checked和checkbox.status的功能一样,注意checkbox.stat ...

  6. [Java] - 格式字符串替换方法

    Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...

  7. Swift编程语言中的方法引用

    由于Apple官方的<The Swift Programming Guide>对Swift编程语言中的方法引用介绍得不多,所以这里将更深入.详细地介绍Swift中的方法引用. Swift与 ...

  8. PHP mkdir 方法 创建 0777 权限的目录问题

    php 中使用 mkdir() 方法创建 0777 权限的目录: $path = './Logs/secondCheck/';if(!is_dir($path)){ mkdir($path, 0777 ...

  9. console.log的一个应用 -----用new方法生成一个img对象和document.createElement方法创建一个img对象的区别

    我用两种方法来生成img对象,第一种方法是用new方法,第二种方法是用document.createElement方法. var img1 = new Image(); var img2 = docu ...

随机推荐

  1. HDU 2454 Degree Sequence of Graph G——可简单图化&&Heavel定理

    题意 给你一个度序列,问能否构成一个简单图. 分析 对于可图化,只要满足度数之和是偶数,即满足握手定理. 对于可简单图化,就是Heavel定理了. Heavel定理:把度序列排成不增序,即 $deg[ ...

  2. Linux Redirecting to /bin/systemctl restart iptables.service

    方案 一 1.昨天碰到一个错误,linux下输入命令:service iptables restart时,总会报下面一个提示很简单,这句话的意思就是让你重定向到systemctl然后再启用,白话就是说 ...

  3. 使用开发IDE生成一个springboot工程。

    说实话,没办法,大势所趋. 当今天下,大企业,还是小公司,只要有想要更高效率的提高开发效率,能频繁迭代,又影响最小,那么只有使用分布式工程开发. 使用它就因为他快,加载东西,插件快,jar包引入方便. ...

  4. [Dart] Dynamic variable in Dart

    First way to create dynamic variable is using 'dymaic' keywrod: dynamic a = 123; a = '123'; Second w ...

  5. spark的广播变量

    直接上代码:包含了,map,filter,persist,mapPartitions等函数 String master = "spark://192.168.2.279:7077" ...

  6. File类的createNewFile()和mkdirs() mkdir()

    createNewFile文件不存在则创建,存在则不创建并返回false,文件路径必须存在才可创建路径下的文件(注意它只能创建文件,即如果你给了/storage/emulated/0/hello/sn ...

  7. Postgresql 日志相关

    目录日志种类作用总结配置文件中与日志相关的配置日志种类 PostgreSQL有3种日志 pg_log(数据库运行日志)   内容可读    默认关闭的,需要设置参数启动pg_xlog(WAL 日志,即 ...

  8. 窗口看门狗 WWDG

    一,窗口看门狗 二,喂狗注意事项 三,程序设计 1.检查复位状态,有助于观察当前工作的可靠性 /* Check if the system has resumed from WWDG reset ,检 ...

  9. Mysql之数据库设计规范

    1. 三大范式首先要明白”范式(NF)”是什么意思.按照教材中的定义,范式是“符合某一种级别的关系模式的集合,表示一个关系内部各属性之间的联系的合理化程度”.数据库范式也分为1NF,2NF,3NF,B ...

  10. 2018-2019-2 20165222《网络对抗技术》Exp9 Web安全基础

    1.实践过程记录 1.字符串型注入. 2.整数型注入 3.注入语句查看其他内容 4.xss是一种漏洞,这种漏洞允许用户输入脚本并且浏览器提交的时候不加编码.这种东西是最为流行并且有害的web应用的问题 ...