iCarousel中的TableView在解包可选值

时间:2017-01-22 17:55:41

标签: swift swift3 icarousel

所以,我有一个“BillSplitters”的旋转木马,在每个旋转木马项目上,它应该显示BillSplitter所拥有的唯一项目。所以我得到fatal error: unexpectedly found nil while unwrapping an Optional value通常情况下,我可以慢慢磨练这样的错误,我发现问题但是当从一个断点逐行跟进时,它进入我无法遵循的iCarousel代码。我也确定我的旋转木马没有出错,好像我没有添加子视图(tableView)那么它运行正常。它似乎也创建了第一对tableview并添加它们然后得到错误。这是我使用的代码:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let splitter = allBillSplitters[carouselIndex]
    if (splitter.items?.count)! > 0 {
        return (splitter.items?.count)!
    } else {
        TableViewHelper.EmptyMessage("\(splitter.name!) has no items to pay for.\nGo back to assign some items to their name.", tableView: tableView)
        return 0
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell: ItemCell = tableView.dequeueReusableCell(withIdentifier: "SplitterItemCell") as! ItemCell
    let itemsSet = allBillSplitters[carouselIndex].items
    let items = itemsSet?.allObjects as! [Item]
    let item = items[indexPath.row]
    let count = item.billSplitters?.count
    if count! > 1 {
        cell.name!.text = "\(item.name!) split \(count!) ways"
        cell.price!.text = "£\(Double(item.price)/Double(count!))"
    } else {
        cell.name!.text = item.name!
        cell.price!.text = "£\(item.price)"
    }

    return cell
}

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

我已经在一些地方读过我应该删除以下函数中的if let view = view语句,因为它不会重复使用这些项并始终创建新项。如果我把它留在里面我在创建第一个轮播项目时会立即得到相同的错误,当我删除它时,它会在创建第三个我的轮播项目时发生。

func carousel(_ carousel: iCarousel, viewForItemAt index: Int, reusing view: UIView?) -> UIView {

    carouselIndex = index

    var splitterView: UIImageView
    var nameLabel: UILabel
    var emailLabel: UILabel
    var totalLabel: UILabel
    var tableView: UITableView

    let splitter = allBillSplitters[index]

    //reuse view if available, otherwise create a new view
    if let view = view as? UIImageView {
        splitterView = view
        //get a reference to the label in the recycled view
        nameLabel = splitterView.viewWithTag(1) as! UILabel
        emailLabel = splitterView.viewWithTag(2) as! UILabel
        totalLabel = splitterView.viewWithTag(3) as! UILabel
        tableView = splitterView.viewWithTag(4) as! UITableView
    } else {

        let height = carousel.contentView.frame.height - 85
        let width = carousel.contentView.frame.width - 80

        //don't do anything specific to the index within
        //this `if ... else` statement because the view will be
        //recycled and used with other index values later
        splitterView = UIImageView(frame: CGRect(x: 0, y: 0, width: width, height: height))
        splitterView.layer.cornerRadius = 10
        splitterView.clipsToBounds = true
        splitterView.image = UIImage(data: splitter.image as! Data, scale:1.0)
        splitterView.contentMode = .scaleAspectFit
        splitterView.backgroundColor = UIColor(netHex: 0xCA9875)

        let viewWidth = Int(splitterView.frame.width)

        nameLabel = UILabel(frame: CGRect(x: 5, y: 0, width: viewWidth, height: 30))
        nameLabel.backgroundColor = .clear
        nameLabel.backgroundColor?.withAlphaComponent(0.1)
        nameLabel.textAlignment = .left
        nameLabel.font = nameLabel.font.withSize(20)
        nameLabel.tag = 1

        emailLabel = UILabel(frame: CGRect(x: 5, y: 30, width: viewWidth, height: 15))
        emailLabel.backgroundColor = .clear
        emailLabel.textAlignment = .left
        emailLabel.font = emailLabel.font.withSize(15)
        emailLabel.tag = 2

        totalLabel = UILabel(frame: CGRect(x: 5, y: 45, width: viewWidth, height: 15))
        totalLabel.backgroundColor = .clear
        totalLabel.textAlignment = .left
        totalLabel.font = totalLabel.font.withSize(15)
        totalLabel.tag = 3

        let tableViewHeight = height - 65
        let frame = CGRect(x: 0, y: 65, width: width, height: tableViewHeight)
        tableView = UITableView(frame: frame)
        tableView.delegate = self
        tableView.dataSource = self
        tableView.tag = 4
        totalLabel.backgroundColor = .clear

        splitterView.addSubview(nameLabel)
        splitterView.addSubview(emailLabel)
        splitterView.addSubview(totalLabel)
        splitterView.addSubview(tableView)
    }

    //set item label
    //remember to always set any properties of your carousel item
    //views outside of the `if (view == nil) {...}` check otherwise
    //you'll get weird issues with carousel item content appearing
    //in the wrong place in the carousel
    nameLabel.text = "\(allBillSplitters[index].name!)"
    emailLabel.text = "\(allBillSplitters[index].email!)"
    totalLabel.text = "£\(allBillSplitters[index].total)"


    return splitterView
}

func carousel(_ carousel: iCarousel, valueFor option: iCarouselOption, withDefault value: CGFloat) -> CGFloat {
    switch option {
    case .spacing:
        return value * 1.2
    case .fadeMin:
        return 0.0
    case .fadeMinAlpha:
        return 0.3
    case .fadeMax:
        return 0.0
    default:
        return value
    }
}

我看了一遍,无法找到解决方案,所以任何帮助都会很棒。感谢

1 个答案:

答案 0 :(得分:1)

我是个白痴。忘记了以下内容:

tableView.register(CarouselTableViewCell.classForCoder(), forCellReuseIdentifier: "carouselTableViewCell")
表视图中的

cellForRowAt函数