测试测试过 | ✗ |
语言语言 | SwiftSwift |
许可证 | MIT |
发布最新发布 | 2016年3月 |
SPM支持 SPM | ✗ |
由 lovemo 维护。
依赖项 | |
MJRefresh | >= 0 |
UITableView+FDTemplateLayoutCell | >= 0 |
总结整理下一个快速开发MVVM框架(抛砖引玉),主要用于分离控制器中的代码,降低代码耦合程度,可以根据自己使用习惯调整代码。欢迎来喷,提issues。代码加入了cell自适应高度,自动缓存网络请求至sqlite数据库,更加高效的数据库存储库。
CocoaPods:
platform :ios, '8.0'
use_frameworks!
pod 'SwiftMVVMKit'
@objc public protocol SMKViewMangerProtocolDelegate: NSObjectProtocol {
/**
设置Controller的子视图的管理者为self
- parameter superView: 一般指subView所在控制器的view
- returns: return value description
*/
optional func smk_viewMangerWithSuperView(superView: UIView)
/**
设置subView的管理者为self
- parameter subView: 管理的subView
- returns: return value description
*/
optional func smk_viewMangerWithSubView(subView: UIView?)
/**
设置添加subView的事件
- parameter subView: 管理的subView
- parameter info: 附带信息,用于区分调用
- returns: return value description
*/
optional func smk_viewMangerWithHandleOfSubView(subView: UIView, info: String?)
/**
返回viewManger所管理的视图
- returns: viewManger所管理的视图
*/
optional func smk_viewMangerOfSubView() -> UIView
/**
得到其它viewManger所管理的subView,用于自己内部
- parameter viewInfos: 其它的subViews
- returns: return value description
*/
optional func smk_viewMangerWithOtherSubViews(viewInfos: [NSObject : AnyObject]?)
/**
需要重新布局subView时,更改subView的frame或者约束
- parameter updateBlock: 更新布局完成的block
*/
optional func smk_viewMangerWithLayoutSubViews(updateBlock: (( ) -> ( ))?)
/**
使子视图更新到最新的布局约束或者frame
*/
optional func smk_viewMangerWithUpdateLayoutSubViews()
}
class FourthViewManger2: NSObject, SMKViewMangerProtocolDelegate {
lazy var fourthView2 = FourthView2.loadInstanceFromNib()
lazy var fourthView = UIView()
func smk_viewMangerWithSuperView(superView: UIView) {
superView.addSubview(fourthView2)
}
// 根据自身需要得到外界的视图view
func smk_viewMangerWithOtherSubViews(viewInfos: [NSObject : AnyObject]?) {
let view1 = viewInfos!["view1"] as! UIView
fourthView = view1
fourthView2.snp_makeConstraints { (make) -> Void in
make.size.equalTo(CGSizeMake(250, 250));
make.top.equalTo(view1.snp_bottom).offset(20);
make.left.equalTo(view1);
}
}
// 根据外界view或model的变化重新布局自己所管理的字视图的位置
func smk_viewMangerWithUpdateLayoutSubViews() {
let offset = CGFloat(arc4random_uniform(70) + 10)
let wh = CGFloat(arc4random_uniform(200) + 50)
let size = CGSizeMake(wh, wh)
fourthView2.snp_updateConstraints { (make) -> Void in
make.top.equalTo(self.fourthView.snp_bottom).offset(offset);
make.size.equalTo(size);
}
fourthView2.setNeedsLayout()
UIView.animateWithDuration(0.5) { () -> Void in
self.fourthView2.layoutIfNeeded()
}
}
}
/**
tableView的一些初始化工作
*/
func setupTableView() {
table.separatorStyle = .None
// 下拉刷新
table.mj_header = MJRefreshNormalHeader { [weak self] () -> Void in
if let strongSelf = self {
strongSelf.viewModel.smk_viewModelWithGetDataSuccessHandler({ (array) -> () in
strongSelf.table.reloadData()
})
// 结束刷新
self!.table.mj_header.endRefreshing()
}
}
table.mj_header.automaticallyChangeAlpha = true
table.tableHander = SMKBaseTableViewManger(cellIdentifiers: [MyCellIdentifier], didSelectBlock: { (_, _) -> Void in
let vc = UIViewController.viewControllerWithStoryboardName("Main", vcIdentifier: "SecondVCID")
self.navigationController?.pushViewController(vc, animated: true)
})
viewModel.smk_viewModelWithGetDataSuccessHandler { (array) -> () in
self.table.tableHander .getItemsWithModelArray({ () -> [AnyObject] in
return array
}, completion: { () -> () in
self.table.reloadData()
})
}
}