【问题标题】:How to optimize UITableViewCell, because my UITableView lags如何优化 UITableViewCell,因为我的 UITableView 滞后
【发布时间】:2023-03-06 01:06:02
【问题描述】:

好的,我的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 分析应用程序。

标签: ios swift uitableview


【解决方案1】:

1) 每个UIView 和子类型都有backgroundColor 默认透明。尝试在每个视图(视图、按钮、图像、堆栈)上添加白色背景色。

2)在你的配置(地址:地址)上检查你是否有不同的地址。

3)在约束设置上尽量敏锐,你让Autolayout得到你的布局越少,使用的cpu就越少。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多