2017-01-22 45 views
0

因此,我有一個「BillSplitters」的傳送帶,並且在每個傳送帶項目上它應該顯示BillSplitter所具有的唯一項目。所以我得到fatal error: unexpectedly found nil while unwrapping an Optional value正常情況下,我可以慢慢磨練這樣的錯誤,我發現問題,但是當從一個逐行的斷點繼續它進入我不能遵循的iCarousel代碼。林也相信沒有什麼問題在我旋轉木馬,就好像我不addSubview(tableView),那麼它運行良好。它似乎也創建了第一對桌面視圖並將它們添加好,然後得到錯誤。下面是使用代碼IM:iCarousel中的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 
    } 
} 

我已經找遍了所有,找不到解決方案,所以任何幫助將是偉大的。謝謝

回答

0

我是個白癡。忘記以下幾點:

tableView.register(CarouselTableViewCell.classForCoder(), forCellReuseIdentifier: "carouselTableViewCell") 
在tableviews cellForRowAt功能

相關問題