滚动几下后,CollectionView在NSISEngine中崩溃

时间:2019-05-07 16:37:50

标签: ios swift

我有一个具有水平流布局的集合视图。滚动大约4至5个单元格后,代码崩溃,并显示SIGABRT错误消息,我在网上找不到其他地方。

无效_removeFromEngineVarTable(NSISEngineVar)()中的声明失败,/ BuildRoot / Library / Caches / com.apple.xbs / Sources / Foundation / Foundation-1562 / Foundation / Layout.subproj / IncrementalSimplex / NSISEngine.m:1518

这是cellForItem的代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    if let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "listingCell", for: indexPath) as? ListingCollectionViewCell {
        cell.listing = listings[indexPath.item]

        cell.segmentedControl.removeAllSegments()
        cell.listing.termContracts.forEach {
            var title = ""

            switch $0.availableFor {
            case "Fall":                title = "Fa"
            case "Fall/Winter":         title = "Fw"
            case "Winter":              title = "Wi"
            case "Spring":              title = "Sp"
            case "Spring/Summer":       title = "Ss"
            case "Summer":              title = "Su"
            case "Year Round":          title = "Year"
            default:                    title = ""
            }

            cell.segmentedControl.insertSegment(withTitle: title, at: cell.segmentedControl.numberOfSegments, animated: false)
        }

        cell.contactLabel.text = cell.listing.contactPhone
        cell.contactPersonLabel.text = cell.listing.contactPerson
        cell.addressLabel.text = cell.listing.address

        //Default data to first contract
        if cell.listing.termContracts.isEmpty {
            cell.rentLabel.text = "N/A"
            cell.sharedPrivateLabel.text = ""
        } else {
            if let rent = cell.listing.termContracts[0].rent {
                cell.rentLabel.text = rent == 0 ? "Free" : "$\(rent)/mo"
            }
            if let sharedPrivate = cell.listing.termContracts[0].sharedPrivate {
                cell.sharedPrivateLabel.text = sharedPrivate
            }
        }

        cell.segmentedControl.selectedSegmentIndex = 0
        return cell
    }

    return UICollectionViewCell()
}

问题出在这一行:

if let rent = cell.listing.termContracts[0].rent {
    cell.rentLabel.text = rent == 0 ? "Free" : "$\(rent)/mo"
}

当我替换为

if let rent = cell.listing.termContracts[0].rent {
    cell.rentLabel.text = rent == 0 ? "Free" : "$\(cell.listing.termContracts[0].rent)"
}

效果很好。但是因为租金是可选的,所以在渲染时会出现难看的“ Optional(___)”。这是一个错误吗?我认为没有任何原因可以破坏,因为我正在安全地处理所有事情。我也不认为放租和扔进去之间没有根本的区别。

当我使集合视图滚动到特定索引时,集合视图也会崩溃,这使我认为这是可重用的问题?

编辑:IB详细信息

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:1)

您遇到自动版式问题。 NSISEngine是自动布局的“求解器”。您尚未描述界面,因此无法提供更精确的帮助,但是在自动布局约束(不平等或降低优先级?)中必须解决一些困难或耗时的事情,并且可能是{{1}上的约束}或与其关联的内容(或colorArray的布局确定属性)。

首先简化该标签的布局,即使这提供了“错误”的界面,并查看是否可以解决问题。如果可以,请尝试以更有效的方式还原约束。

答案 1 :(得分:1)

我向uiLabel添加了固定宽度约束,并且停止崩溃。感谢@Matt the Legend,帮助我弄清楚了这一点!