1.编码转换:
dataString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) ?? "" requestData.stringValue.removingPercentEncoding ?? ""
2.取值需要判断为空设置为空,防止取值崩溃:
//总页数 let totalPageCount = dicData?["recordNum"] as? String //菜品数据源 var dataSource = dicData?["orderInfo"] as? [Dictionary<String,Any>] ?? [Dictionary<String,Any>]()
3.可以在UIView里添加刷新,block传递到控制器操作网络请求即可:
//上拉加载 historyTableView.mj_footer = MJRefreshAutoNormalFooter(refreshingBlock : {[weak self]() -> Void in self?.refreshBack?() })
4.setNeedsLayout和layoutIfNeeded区别:
不能直接调用这个方法layoutSubviews。强制刷新布局,调用 setNeedsLayout,如果想马上刷新界面,调用layoutIfNeeded
setNeedsLayout
标记为需要重新布局,不立即刷新,但layoutSubviews一定会被调用
配合layoutIfNeeded立即更新
layoutIfNeeded
如果,有需要刷新的标记,立即调用layoutSubviews进行布局
一般写在UIView动画里。
https://yiweifen.com/html/news/WaiYu/74770.html
5.for循环推荐使用:
for (index,item) in potTaste.details.enumerated() { } data.forEach { (label, model) in { }
6.枚举不同的type,设置不同的属性:
enum ButtonName { case Split(String,UIColor,UIColor) //拆分 case Doubly(String,UIColor,UIColor) //倍增 case Delay(String,UIColor,UIColor) //延迟 case SureOrder(String,UIColor,UIColor) //确认下单 case Rush(String,UIColor,UIColor) //催菜 case Confirm(String,UIColor,UIColor) //确认上菜 case Gift(String,UIColor,UIColor) //赠菜 case GiveBack(String,UIColor,UIColor) //退菜 case ChangeTableDish //单品转台 }
7.Cell中接受多个model可以使用元组:
typealias ModelTuple = (dishLabel: DishLabel, dishViewModel: DishViewModel) var model: ModelTuple!
8.CollectionView 大量 Item 快速滑动时掉帧严重问题的优化:
if #available(iOS 10.0, tvOS 10.0, *) { collectionView?.prefetchDataSource = self }
9.convert。。。to。。。:
// 将collectionView在控制器view的中心点转化成collectionView上的坐标 var topPoint = CGPoint(x: UIScreen.main.bounds.size.width*0.5, y: NavigationBarH) var pInView = view.convert(topPoint, to: collectionView)
10.MJRefresh根据拖拽比例自动切换透明度:
let header = MJRefreshNormalHeader(refreshingTarget: self, refreshingAction: #selector(loadNew)) // 设置自动切换透明度(在导航栏下面自动隐藏) header?.isAutomaticallyChangeAlpha = true;