我认为创建自定义类来配置表格单元是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
。
更新
在接收者的ViewController扩展中调用configureSelectedCategoryCell()
:
extension CreateRecipeVC: RecipeCategoryTableVCDelegate {
func categoryController(controller: RecipeCategoryTableVC, didSelectCategory category: String) {
selectedCategory = category
self.navigationController?.popViewControllerAnimated(true)
let cell = RecipeCategoryCell()
cell.configureSelectedCategoryCell(selectedCategory)
}
}
答案 0 :(得分:1)
当您尝试在configureSelectedCategoryCell
中访问单元格时,单元格的出口不会被实例化。
据我所知,单元格是在Interface Builder中设计的,因此单元格对象cell
的出口缺少对Interface Builder中控件的引用。
选择类别后,您应该
这样的事情:
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
}
}