总结整理下一个快速开发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() }) } }
- 只需实现加载请求以及配置自定义cell和上述代码,就能轻松实现以下效果,最重要的是代码解耦。
- 如果在使用过程中遇到BUG,希望你能Issues我,谢谢(或者尝试下载最新的代码看看BUG修复没有)
- 如果在使用过程中发现功能不够用,希望你能Issues我,我非常想为这个框架增加更多好用的功能,谢谢
- Service Oriented 的 iOS 应用架构
- 新浪微博iOS客户端架构与优化之路
- 糯米移动组件架构演进之路
- 文化碰撞:函数式、面向协议、面向对象编程的最佳实践
- 探索 Swift 中的 MVC-N 模式
- Code-T 沙龙资料
- 高速公路换轮胎——为遗留系统替换数据库
- 围观神仙打架,反革命工程师《iOS应用架构谈 组件化方案》和蘑菇街Limboy的《蘑菇街 App 的组件化之路》的阅读指导
- iOS 组件化方案探索
- iOS应用架构谈 组件化方案
- 解耦神器 —— 统跳协议和Rewrite引擎
- 携程移动App架构优化之旅
- 蘑菇街App的组件化之路
- 蘑菇街 App 的组件化之路·续
- 猿题库 iOS 客户端架构设计
- 豆瓣混合开发实践
- 滴滴出行iOS客户端架构演进之路
- 不要写死!天猫App的动态化配置中心实践
- 为移动应用提供离线支持
- 携程App的网络性能优化实践
- QCon旧金山演讲总结:阿里无线技术架构演进