Ok, my UITableView is too complicated for loading. And when paging between UIPageViewController, then it lags, I cannot simply and fast swipe between pages. What is wrong?
How doest it work?
My UIViewController has UITableView with lot of cells. Those view controllers are part of UIPageViewController. Swiping between them... lags.
How can I optimize the app to speed it up?
I discovered that this is because of my UITableViewCell, when no cells, then it is simple... and works like a charm. But when cells are loaded, then it lags.
This is my UITableViewCell:
This is my 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
}
and 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
}


cellForRowAtIndexPath? The issue is almost certainly not UI-related, but logic/API call related. - Connor NevilleNSFRCand data is assigned to labels and some icons. - Bartłomiej Semańczyk