如何优化 UITableViewCell,因为我的 UITableView 滞后

Posted

技术标签:

【中文标题】如何优化 UITableViewCell,因为我的 UITableView 滞后【英文标题】:How to optimize UITableViewCell, because my UITableView lags 【发布时间】:2018-04-01 18:07:08 【问题描述】:

好的,我的UITableView 加载太复杂了。当在UIPageViewController 之间进行分页时,它会滞后,我不能简单而快速地在页面之间滑动。怎么了?

它是如何工作的?

我的UIViewControllerUITableView 有很多单元格。这些视图控制器是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。