cellForRow没有被调用但是numberOfRowsInSection是

时间:2017-10-19 18:06:22

标签: swift uitableview icarousel

所以,我已经检查过主线程上正在调用tableview.reloadData()并且numberOfRowsInSection有值。当我查看视图层次结构时,tableView显然在那里,并在设置时显示背景颜色。我注意到的很奇怪的是,视图层次结构显示了一个空列表(可理解),但它包含两个UIImageView,一个在右上角,另一个在左下角。根本不明白这一点。我的tableView嵌套在iCarousel中,我确定问题所在。我的代码完全是程序化的,所以我认为这可能是有价值的:

iCarouselDatasource :(轮播没有单元格而是视图)

class BillCarouselDataSource: NSObject, iCarouselDataSource {

    var bills = [Bill]()

    func numberOfItems(in carousel: iCarousel) -> Int {
        return bills.count
    }

    func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {
        let bill = bills[index]
        let billCarouselView = BillCarouselView(bill: bill)
        billCarouselView.frame = carousel.frame
        billCarouselView.setupView()

        return billCarouselView
    }
}

iCarousel视图(单元格)

class BillCarouselView: UIView {

    private var bill: Bill!

    private let nameLabel = CarouselLabel()
    private let locationLabel = CarouselLabel()
    private let dateLabel = CarouselLabel()
    private let splitButton = CarouselButton()
    private let tableView = UITableView()

    required init(bill: Bill) {
        super.init(frame: .zero)

        self.bill = bill
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func setupView() {
        setupHierarchy()
        setupViews()
        setupLayout()
    }

    private func setupHierarchy() {
        addSubview(nameLabel)
        addSubview(locationLabel)
        addSubview(dateLabel)
        addSubview(tableView)
        addSubview(splitButton)
    }

    private func setupViews() {
        accessibilityIdentifier = AccesID.carouselView
        isUserInteractionEnabled = true
        layer.cornerRadius = Layout.carouselViewCornerRadius
        backgroundColor = Color.carouselView

        nameLabel.text = bill.name
        nameLabel.textAlignment = .center
        nameLabel.accessibilityIdentifier = AccesID.carouselNameLabel

        locationLabel.text = bill.location
        locationLabel.textAlignment = .left
        locationLabel.accessibilityIdentifier = AccesID.carouselLocationLabel

        dateLabel.text = bill.creationDate
        dateLabel.font = Font.carouselDateText
        dateLabel.textAlignment = .right
        dateLabel.accessibilityIdentifier = AccesID.carouselDateLabel

        let dataSource = CarouselTableViewDataSource()
        let delegate = CarouselTableViewDelegate()

        tableView.backgroundColor = .clear
        tableView.separatorStyle = .none
        tableView.dataSource = dataSource
        tableView.delegate = delegate
        tableView.register(CarouselTableViewCell.classForCoder(),
                           forCellReuseIdentifier: "carouselTableViewCell")
        dataSource.items = bill.items
        tableView.reloadData()

        let buttonTitle = "Split £\(bill.totalPrice())"
        splitButton.setTitle(buttonTitle, for: .normal)
    }

    private func setupLayout() {
        nameLabel.pinToSuperview(edges: [.top, .left, .right])

        locationLabel.pinToSuperview(edges: [.left],
                                     constant: Layout.spacer,
                                     priority: .required)
        locationLabel.pinTop(to: nameLabel, anchor: .bottom)
        locationLabel.pinRight(to: dateLabel, anchor: .left)

        dateLabel.pinToSuperview(edges: [.right],
                                 constant: -Layout.spacer,
                                 priority: .required)
        dateLabel.pinTop(to: nameLabel, anchor: .bottom)

        tableView.pinTop(to: dateLabel, anchor: .bottom)
        tableView.pinToSuperview(edges: [.left, .right])
        tableView.pinBottom(to: splitButton, anchor: .top)

        splitButton.pinToSuperview(edges: [.left, .right, .bottom])
    }
}


class CarouselTableViewDataSource: NSObject, UITableViewDataSource {

    var items: [Item]? {
        didSet {
            let duplicatedItems = items
            filteredItems = duplicatedItems?.filterDuplicates { ( $0.creationID ) }
        }
    }

    private var filteredItems: [Item]!

    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return filteredItems.count
    }

    //Set what each cell in the tableview contains.
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell: CarouselTableViewCell = tableView.dequeueReusableCell(withIdentifier: "carouselTableViewCell") as! CarouselTableViewCell
        let duplicateItems = items?.filter { Int($0.creationID)! == indexPath.row }
        let quantity = "\(duplicateItems!.count) x "
        let name = duplicateItems![0].name
        let price = formatPrice(duplicateItems![0].price)

        cell.quantityLabel.text = quantity
        cell.nameLabel.text = name
        cell.priceLabel.text = price

        return cell
    }

    private func formatPrice(_ stringPrice: String) -> String {
        var formattedPrice = stringPrice
        let price = NSNumber(value: Double(stringPrice)!)
        let formatter = NumberFormatter()
        formatter.numberStyle = .currency
        if let formattedTipAmount = formatter.string(from: price) {
            formattedPrice = "Tip Amount: \(formattedTipAmount)"
        }
        return formattedPrice
    }
}

类CarouselTableViewCell:UITableViewCell {

var containerView = UIView()
var quantityLabel = UILabel()
var nameLabel = UILabel()
var priceLabel = UILabel()

override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: "carouselTableViewCell")

    setupHierarchy()
    setupViews()
    setupLayout()
}

required init(coder aDecoder: NSCoder) {
    fatalError("init(coder:)")
}

private func setupHierarchy() {
    containerView.addSubview(quantityLabel)
    containerView.addSubview(nameLabel)
    containerView.addSubview(priceLabel)
    containerView.addSubview(containerView)
    contentView.addSubview(containerView)
}

private func setupViews() {
    quantityLabel.textAlignment = .left
    quantityLabel.backgroundColor = .clear
    quantityLabel.textColor = Color.carouselText

    nameLabel.textAlignment = .left
    nameLabel.backgroundColor = .clear
    nameLabel.textColor = Color.carouselText

    priceLabel.textAlignment = .right
    priceLabel.backgroundColor = .clear
    priceLabel.textColor = Color.carouselText

}

private func setupLayout() {
    containerView.pinToSuperview(edges: [.left, .right])
    containerView.pinToSuperviewTop(withConstant: -2, priority: .required, relatedBy: .equal)
    containerView.pinToSuperviewBottom(withConstant: -2, priority: .required, relatedBy: .equal)

    quantityLabel.pinToSuperview(edges: [.top, .left, .bottom])

    nameLabel.pinToSuperview(edges: [.top, .bottom])
    nameLabel.pinLeft(to: quantityLabel, anchor: .right)
    nameLabel.pinRight(to: priceLabel, anchor: .left)

    priceLabel.pinToSuperview(edges: [.top, .right, .bottom])

    }
}

iCarousel视图(单元格)中的所有内容都显示了单元格的内容。

任何帮助或见解都会很棒

0 个答案:

没有答案