如何优化 UITableViewCell,因为我的 UITableView 滞后
Posted
技术标签:
【中文标题】如何优化 UITableViewCell,因为我的 UITableView 滞后【英文标题】:How to optimize UITableViewCell, because my UITableView lags
【发布时间】:2018-04-01 18:07:08
【问题描述】:
好的,我的UITableView
加载太复杂了。当在UIPageViewController
之间进行分页时,它会滞后,我不能简单而快速地在页面之间滑动。怎么了?
它是如何工作的?
我的UIViewController
有UITableView
有很多单元格。这些视图控制器是UIPageViewController
的一部分。在它们之间滑动...滞后。
如何优化应用程序以加快速度?
我发现这是因为我的UITableViewCell
,当没有单元格时,它很简单......并且就像一个魅力。但是当单元格被加载时,它就会滞后。
这是我的UITableViewCell
:
这是我的cellForRow:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let address = fetchedResultsController.object(at: indexPath)
let cell = tableView.dequeueReusableCell(withIdentifier: AddressTableViewCellIdentifier, for: indexPath) as! AddressTableViewCell
cell.configure(with: address)
cell.isSelectionMode = isSelectionMode
cell.isSelected = selectedAddresses.contains(address)
return cell
和AddressTableViewCell
:
类地址表视图单元: UITableViewCell
@IBOutlet 私有变量 nameLabel:UILabel!
@IBOutlet private var emptyButton:UIButton!
@IBOutlet 私有变量被拒绝按钮:UIButton!
@IBOutlet private var dateForLastNoteLabel:UILabel!
@IBOutlet 私有变量地址NoteLabel:UILabel!
@IBOutlet private var lastNoteLabel:UILabel!
@IBOutlet private var returnVisitImageView:AttributedImageView!
@IBOutlet private var regularDeliveryImageView:AttributedImageView!
@IBOutlet 私有变量 studyImageView:AttributedImageView!
@IBOutlet private var emailImageView:AttributedImageView!
@IBOutlet private var phoneNumberImageView: AttributedImageView!
@IBOutlet private var actionButtonsWidthConstraint:NSLayoutConstraint!
@IBOutlet 私有变量 selectViewWidthConstraint:NSLayoutConstraint!
@IBOutlet private var selectView:AttributedView!
私有变量地址:地址!
var isSelectionMode: 布尔 = 假
设置
emptyButton.isEnabled = !isSelectionMode
拒绝按钮.isEnabled = !isSelectionMode
selectViewWidthConstraint.constant = isSelectionMode ? 50 : 0
附件类型 = isSelectionMode ? .none : .disclosureIndicator
覆盖 var isSelected: Bool
设置
selectView.backgroundColor = isSelected ? Settings.shared.currentMode.homeColor : UIColor.clear
//MARK: - 类方法
//MARK: - 初始化
//MARK: - 去初始化
//MARK: - 动作
@IBAction func emptyButtonTapped(_ sender: UIButton)
保存(withStatus: [0, 2].contains(address.status) ? 1 : 0)
@IBAction func rejectButtonTapped(_ sender: UIButton)
保存(withStatus:[0, 1].contains(address.status)?2:0)
//MARK: - 打开
//MARK: - 内部
func 配置(地址:地址)
self.address = 地址
让状态 = 地址状态(原始值:地址.状态)!
addressNoteLabel.text = 地址.text
nameLabel.text = 地址.名称
emptyButton.tintColor = 状态 == .empty ? UIColor.black : UIColor.lightGray.withAlphaComponent(0.4)
拒绝按钮.tintColor = 状态 == .rejected ? UIColor.red : UIColor.lightGray.withAlphaComponent(0.4)
returnVisitImageView.isHidden = 状态 != .returnVisit
returnVisitImageView.topImageViewTintColor = Settings.shared.currentMode.homeColor
regularDeliveryImageView.isHidden = !address.isRegularDelivery
regularDeliveryImageView.topImageViewTintColor = Settings.shared.currentMode.homeColor
studyImageView.isHidden = !address.isStudy
studyImageView.topImageViewTintColor = Settings.shared.currentMode.homeColor
emailImageView.isHidden = address.email == nil
emailImageView.topImageViewTintColor = Settings.shared.currentMode.homeColor
phoneNumberImageView.topImageViewTintColor = Settings.shared.currentMode.homeColor
phoneNumberImageView.isHidden = address.phoneNumber == nil
dateForLastNoteLabel.text = nil
lastNoteLabel.text = nil
actionButtonsWidthConstraint.constant = [AddressStatus.returnVisit, ].contains(status) ||地址.isStudy ||地址.isRegularDelivery ? 0 : 100
如果 !returnVisitImageView.isHidden && address.lastNote == nil
dateForLastNoteLabel.text = " "
if let note = address.lastNote
dateForLastNoteLabel.text = note.descriptiveDateAndTime
lastNoteLabel.text = note.text
//MARK: - 私有
私人函数保存(withStatus状态:Int16)
emptyButton.isEnabled = false
拒绝按钮.isEnabled = false
MagicalRecord.save( [weak self] context in
self?.address.mr_(in: context)?.status = status
) [弱自我] _,错误
守卫让 `self` = self else
返回
UIAlertController.show(来自:错误)
如果错误 == nil
Sync.saveForSync(标识符:self.address.identifier,原因:1)
CloudAssistant.shared.performSyncing()
self.emptyButton.isEnabled = true
self.rejectedButton.isEnabled = true
//MARK: - 被覆盖
【问题讨论】:
cellForRowAtIndexPath
中有什么代码?这个问题几乎肯定与 UI 无关,而是与逻辑/API 调用有关。
一切都从NSFRC
获取,数据分配给标签和一些图标。
单元格有很多 UI 元素,每次调用 cellForRow 方法时都会重新计算它的约束,尝试删除堆栈视图,并在没有它们的情况下解决问题。
好的,我试着让你知道......然后它是如何工作的......
我建议使用 Time Profiler 分析应用程序。
【参考方案1】:
1) 每个UIView
和子类型都有backgroundColor
默认透明。尝试在每个视图(视图、按钮、图像、堆栈)上添加白色背景色。
2)在你的配置(地址:地址)上检查你是否有不同的地址。
3)在约束设置上尽量敏锐,你让Autolayout
得到你的布局越少,使用的cpu就越少。
【讨论】:
以上是关于如何优化 UITableViewCell,因为我的 UITableView 滞后的主要内容,如果未能解决你的问题,请参考以下文章
如何在UITableViewCell - Swift 3中删除标签后仍然保持约束
如何从 UITableViewCell 输入新视图? (当表格视图从 .plist 获取其信息时)
自定义 UITableviewCell 放弃内存问题
优化 UITableViewCell 上的绘图
如何让我的 UITableViewCell 包含两个标签?
如何在标准 UITableViewCell 中以编程方式自动布局右侧的自定义 UIButton。