首页 文章

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

提问于
浏览
0

好的,我的 UITableView 太复杂了,无法加载 . 而当 UIPageViewController 之间的分页,然后它滞后,我不能简单快速地在页面之间滑动 . 怎么了?

How doest it work?

我的 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

class AddressTableViewCell: UITableViewCell {

    @IBOutlet private var nameLabel: UILabel!
    @IBOutlet private var emptyButton: UIButton!
    @IBOutlet private var rejectedButton: UIButton!
    @IBOutlet private var dateForLastNoteLabel: UILabel!
    @IBOutlet private var addressNoteLabel: UILabel!
    @IBOutlet private var lastNoteLabel: UILabel!
    @IBOutlet private var returnVisitImageView: AttributedImageView!
    @IBOutlet private var regularDeliveryImageView: AttributedImageView!
    @IBOutlet private var studyImageView: AttributedImageView!
    @IBOutlet private var emailImageView: AttributedImageView!
    @IBOutlet private var phoneNumberImageView: AttributedImageView!
    @IBOutlet private var actionButtonsWidthConstraint: NSLayoutConstraint!

    @IBOutlet private var selectViewWidthConstraint: NSLayoutConstraint!
    @IBOutlet private var selectView: AttributedView!

    private var address: Address!

    var isSelectionMode: Bool = false {

        didSet {

            emptyButton.isEnabled = !isSelectionMode
            rejectedButton.isEnabled = !isSelectionMode
            selectViewWidthConstraint.constant = isSelectionMode ? 50 : 0
            accessoryType = isSelectionMode ? .none : .disclosureIndicator
        }
    }

    override var isSelected: Bool {

        didSet {
            selectView.backgroundColor = isSelected ? Settings.shared.currentMode.homeColor : UIColor.clear
        }
    }

    //MARK: - Class Methods

    //MARK: - Initialization

    //MARK: - Deinitialization

    //MARK: - Actions

    @IBAction func emptyButtonTapped(_ sender: UIButton) {
        save(withStatus: [0, 2].contains(address.status) ? 1 : 0)
    }

    @IBAction func rejectButtonTapped(_ sender: UIButton) {
        save(withStatus: [0, 1].contains(address.status) ? 2 : 0)
    }

    //MARK: - Open

    //MARK: - Internal

    func configure(with address: Address) {

        self.address = address

        let status = AddressStatus(rawValue: address.status)!

        addressNoteLabel.text = address.text
        nameLabel.text = address.name
        emptyButton.tintColor = status == .empty ? UIColor.black : UIColor.lightGray.withAlphaComponent(0.4)
        rejectedButton.tintColor = status == .rejected ? UIColor.red : UIColor.lightGray.withAlphaComponent(0.4)
        returnVisitImageView.isHidden = status != .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) || address.isStudy || address.isRegularDelivery ? 0 : 100

        if !returnVisitImageView.isHidden && address.lastNote == nil {
            dateForLastNoteLabel.text = "  "
        }

        if let note = address.lastNote {

            dateForLastNoteLabel.text = note.descriptiveDateAndTime
            lastNoteLabel.text = note.text
        }
    }

    //MARK: - Private

    private func save(withStatus status: Int16) {

        emptyButton.isEnabled = false
        rejectedButton.isEnabled = false

        MagicalRecord.save({ [weak self] context in

            self?.address.mr_(in: context)?.status = status

        }) { [weak self] _, error in

            guard let `self` = self else {
                return
            }

            UIAlertController.show(from: error)

            if error == nil {

                Sync.saveForSync(identifier: self.address.identifier, reason: 1)
                CloudAssistant.shared.performSyncing()
            }

            self.emptyButton.isEnabled = true
            self.rejectedButton.isEnabled = true
        }
    }

    //MARK: - Overridden
}

1 回答

  • 0

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

    2)在您的配置(使用地址:地址)上检查您是否没有相同的地址 .

    3)尝试在约束设置上保持敏锐,让Autolayout获得布局的次数越少,使用的cpu就越少 .

相关问题