我以前从未遇到过这个问题,但这是我目前遇到的问题:
我在视图控制器中有一个UITableView。 Delegate和dataSource设置正确。 现在,在显示/插入几个单元格后,我遇到了性能问题。 问题是tableview似乎没有将某些单元格出列,而是每次都创建一个新单元格(总是在自定义类中调用awakeFromNib)。
出列似乎不起作用的那些只是带有标签的简单的,有些带有标签,图像和另一个标签。 然而,有一种情况下,出列似乎是有效的。我有一个自定义单元格类,它只包含一个垂直堆栈视图,我可以动态添加可变数量的自定义按钮。
我有一个负责设置单元格的类。它为我使用的每个单元类都有一个方法。
func initialModeratorCell(at indexPath: IndexPath, with message: Message, in tableView: UITableView) -> OnboardingInitialModeratorCell{
guard let cell = tableView.dequeueReusableCell(withIdentifier: initalModeratorCellIndentifier) as? OnboardingInitialModeratorCell else{
fatalError("No cell with \(initalModeratorCellIndentifier) identifier")
}
if indexPath.row != 0{
cell.moderatorImage.isHidden = true
}
let attributedMessage = attributedString(for: message, with: paragraphStyleFor(message: message))
cell.mesageText.attributedText = attributedMessage
cell.dateLabel.text = message.userType.name()
cell.mesageText.sizeToFit()
cell.dateLabel.sizeToFit()
return cell
}
所有这些方法都与此类似。这个似乎没有被重用。
这是一个可以重复使用的(awakeFromNib
只调用一次):
func componentCell(from item: ConversationItem, in tableView: UITableView, with owner: OnboardingComponentCellDelegate) -> OnboardingComponentCell{
guard let comp = item as? Component else{
fatalError("Type of item is not Component, but should be!")
}
guard let cell = tableView.dequeueReusableCell(withIdentifier: componentButtonsCellIdentifier) as? OnboardingComponentCell else{
fatalError("No cell with \(componentButtonsCellIdentifier) identifier")
}
cell.componentStack.translatesAutoresizingMaskIntoConstraints = false
setupComponentCell(cell, for: comp, owner: owner)
return cell;
}
这是setupCell()
:
setupComponentCell(_ cell: OnboardingComponentCell, for comp: Component, owner: OnboardingComponentCellDelegate){
cell.reset()
cell.component = comp
OnboardingComponentManager.createComponent(for: comp, in: cell, delegate: owner)
}
cell.reset()
方法如下所示:
func reset(){
component = nil
delegate = nil
componentStack.removeAll() //removeAll is in an extension on UIStackView
}
调用OnboardingComponentManager.createComponent()
只是使用所述组件的正确按钮填充堆栈视图。
上述方法(componentCell(from:)
和initialModeratorCell(at:)
是从公共方法onboardingCellForItem(at indexPath: IndexPath, ..)
调用的:
static func onboardingCellForItem(at indexPath: IndexPath, with displayedItems: Items, in tableView: Table, typingDelegate: IndicatorDelegate, buttonOwner: CellDelegate, onboardingType: ConvType) -> UITableViewCell{
let item = displayedItems[indexPath.row]
if item.type == .message{
return messageCell(from: item, at: indexPath, in: tableView, with: displayedItems)
}else if item.type == .component{
return componentCell(from: item, in: tableView, with: buttonOwner)
}else if item.type == .typingIndicator{
return typingIndicatorCell(with: typingDelegate, in: tableView)
}
return UITableViewCell()
}
然后从dataSource方法cellForRowAtIndexPath
调用此方法,如下所示:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
return OnboardingCellManager.onboardingCellForItem(at: indexPath, with: displayedItems, in: tableView, typingDelegate: self, buttonOwner: self, onboardingType: .onboarding)
}
单元格在tableView的故事板中原型化(作为原型单元格)。
我在这里碰到了一堵墙。我以前从来没有碰到这个问题,我似乎无法找到它为什么会发生的原因。 这种性能下降在旧设备(iPhone 5等)上最为显着。