我的表视图包含一些按类型排序的元素:TypeA,TypeB和TypeC。
我希望当我点击带有TypeA的单元格将选择颜色更改为红色时,当我在TypeB上键入以将颜色更改为蓝色时以及按下TypeC时将颜色更改为黄色。
现在我想出了这段代码:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
}
func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
guard let mode = dataSource.selectedObject else {
fatalError("willDisplayCell, but no selected row?")
}
let type = ModeType(rawValue: mode.type)!
let selectionColor = UIView() as UIView
selectionColor.backgroundColor = type.color()
cell.selectedBackgroundView = selectionColor
}
我的问题是,当我启动应用程序并且我的数据源为空时调用willDisplayCell
,因此我收到致命错误。
我怎样才能克服这一点?也许只有在调用didSelectRowAtIndexPath
时才使用标志来执行此操作
还是有另一种方法可以实现我的目标吗?
答案 0 :(得分:2)
我假设您已经创建了自定义UITableviewCell。创建一个单元格类型枚举。
enum CellType {
case RedCell
case Yellowcell
case OrangeCell
}
//Create enum property
class CustomCell : UITableViewCell {
var cellType:CellType = CellType.RedCell //Default is RedCell
}
现在您必须在ViewController tableview数据源中指定单元格类型。
override func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! {
var cell : UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell") as! CustomCell
cell.cellType = .RedCell //your choice
return cell
}
override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
return true
}
override func tableView(tableView: UITableView, didHighlightRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.cellForRowAtIndexPath(indexPath)
switch(cell.cellType) {
//Handle Switch case
case .RedCell:
cell?.contentView.backgroundColor = UIColor.redColor()
cell?.backgroundColor = UIColor.redColor()
}
}
override func tableView(tableView: UITableView, didUnhighlightRowAtIndexPath indexPath: NSIndexPath) {
var cell = tableView.cellForRowAtIndexPath(indexPath)
// Set unhighlighted color
cell?.contentView.backgroundColor = UIColor.blackColor()
cell?.backgroundColor = UIColor.blackColor()
}
修改强>: 如果您已创建3种不同类型的单元格类检查tableview单元格类型并更改 didHighlightRowAtIndexPath 方法中的颜色。
答案 1 :(得分:1)
仅当您的数据源告诉表视图有要显示的行时,才会调用我的问题是当我启动时会调用willDisplayCell 应用程序和我的数据源是空的,所以我得到一个致命的错误。
tableView(_:willDisplayCell:forRowAtIndexPath:)
。所以问题更可能是当您的数据源为空时,您的tableView(_:numberOfRowsInSection:)
方法返回的数字大于零。
此外,您的代码看起来只需要为所选行调用tableView(_:willDisplayCell:forRowAtIndexPath:)
。它会被调用所有显示的行。但是这种方法不必影响背景颜色。事实上,它在大多数应用程序中很少使用。只有少数边缘情况需要在显示之前弄乱单元格。
设置选择背景颜色的正确方法是创建UIView
并将其分配给单元格的selectedBackgroundView
属性。您可以从单元格的子类(对于复杂单元格首选)或从tableView:cellForRowAtIndexPath:
数据源方法执行此操作:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("MyCell")
cell!.textLabel?.text = "Kilroy was here."
cell!.selectedBackgroundView = UIView(frame: cell!.bounds)
cell!.selectedBackgroundView!.backgroundColor = .greenColor()
return cell!
}