Swift 2.1 - 自定义UITableViewCell类

时间:2016-03-31 13:02:08

标签: ios xcode swift uitableview

我认为创建自定义类来配置表格单元是iOS开发的标准做法。我也将此练习应用到我的应用中,但我遇到了一些问题。

我有两个表格视图 - 每个ViewController一个 - 他们的单元格使用相同的自定义单元格类。

CustomCellClass

import UIKit

class RecipeCategoryCell: UITableViewCell {

    @IBOutlet weak var recipeCategoryLabel: UILabel!
    @IBOutlet weak var chooseCategoryLabel: UILabel!

    //...

    func configureCell(recipe: Recipe) {
        let category = recipe.category as? RecipeCategory
        recipeCategoryLabel.text = category!.name
    }

    func configureNewCell(category: RecipeCategory) {
        recipeCategoryLabel.text = category.name
    }

    // re-configure receiver's viewcontroller cell with selected category value
    func configureSelectedCategoryCell(selectedCategory: String) {        
        recipeCategoryLabel.text = selectedCategory
    }

    // configure all available category names in the sender's viewcontroller
    func configureChooseCategoryCell(category: RecipeCategory) {
        chooseCategoryLabel.text = category.name
    }
}

@IBOutlet weak var recipeCategoryLabel: UILabel!属于接收方viewController,@IBOutlet weak var chooseCategoryLabel: UILabel!属于发送方viewController

我在第recipeCategoryLabel.text = selectedCategory行的第3个函数中遇到问题Xcode

  

致命错误:在打开Optional时意外发现nil   值

我没有在使用相同IBOutlet recipeCategoryLabel的其他函数上遇到此问题,但只有使用选定类别值重新配置接收器ViewController单元格的函数configureSelectedCategoryCell()。 所以我可以肯定地说这不是故事板的连接问题。

我认为这种情况正在发生,因为在多个地方使用了相同的IBOutlet属性。但问题是,我必须使用相同的属性,以便我可以设置默认值,更新选定的值,在同一标签上设置以前的持久值。

我不知道我的解释是否足够清楚,但基本上我无法设置接收者ViewController的表格单元格标签,其中包含从发件人传递的所选类别值' s ViewController

更新

enter image description here

在接收者的ViewController扩展中调用configureSelectedCategoryCell()

extension CreateRecipeVC: RecipeCategoryTableVCDelegate {

func categoryController(controller: RecipeCategoryTableVC, didSelectCategory category: String) {

    selectedCategory = category

    self.navigationController?.popViewControllerAnimated(true)

    let cell = RecipeCategoryCell()
    cell.configureSelectedCategoryCell(selectedCategory)

}

}

1 个答案:

答案 0 :(得分:1)

当您尝试在configureSelectedCategoryCell中访问单元格时,单元格的出口不会被实例化。

据我所知,单元格是在Interface Builder中设计的,因此单元格对象cell的出口缺少对Interface Builder中控件的引用。

选择类别后,您应该

  1. 更新tableView的数据源
  2. 重新加载tableView的项目
  3. 这样的事情:

    func categoryController(controller: RecipeCategoryTableVC, didSelectCategory category: String) {
    
        selectedCategory = category
        self.navigationController?.popViewControllerAnimated(true)
    
        tableViewDataSource[selectedItemIndex].selectedCategory = selectedCategory
        tableView.reloadData()
    }
    

    然后在表视图中数据源委托:

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    
       let cell = tableView.dequeueReusableCellWithIdentifier("YourCellIdentifer") as! RecipeCategoryCell
       cell.configureSelectedCategoryCell(tableViewDataSource[indexPath.row].selectedCategory)
       return cell
    }
    

    旁注:

    将一个IBOutlet连接到故事板中的多个控件是合法的。

    作为预防措施,我建议删除configureCell中可选项的强行展开,例如

    func configureCell(recipe: Recipe) {
        if let category = recipe.category as? RecipeCategory {
           recipeCategoryLabel.text = category.name
        }
    }