UITableView不会将某些单元格出列

时间:2017-07-19 20:14:24

标签: ios swift uitableview

我以前从未遇到过这个问题,但这是我目前遇到的问题:

我在视图控制器中有一个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等)上最为显着。

0 个答案:

没有答案