在 swift 中初始化时 tableview 的单元格不是 nil
Posted
技术标签:
【中文标题】在 swift 中初始化时 tableview 的单元格不是 nil【英文标题】:cell of tableview is not nil on initialize in swift 【发布时间】:2015-01-15 10:32:24 【问题描述】:我是 swift 编程的初学者,也是 ios 的新手。我正在尝试制作表格视图,但 if(cell == nil) 的条件但单元格从不为零并且不会进入条件这是我的代码。
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
//cell content declaration
var rightlabel = UILabel(frame: CGRectMake(200, 10, 200, 21))
var mainTextLabel = UILabel(frame: CGRectMake(10, 10, 200, 21))
var imageView = UIImageView()
var cell : UITableViewCell!
cell = tableView.dequeueReusableCellWithIdentifier("detailsCell") as? UITableViewCell
//cell content declaration END
if(cell == nil)
cell = tableView.dequeueReusableCellWithIdentifier("detailsCell", forIndexPath: indexPath) as UITableViewCell
let test: AnyObject? = myData?.objectForKey("\(indexPath.row + 1)")
let hrvalue : AnyObject? = test?.objectForKey("name")
let subtitle : NSNumber? = test?.objectForKey("distance") as? NSNumber
let icon : String = test?.objectForKey("icon") as String
//CUSTOM LABEL START FROM HERE
mainTextLabel.text = hrvalue as? String
rightlabel.text = "\(subtitle as Float ) k.m. away from here."
mainTextLabel.font = UIFont.systemFontOfSize(18.0)
rightlabel.font = UIFont.systemFontOfSize(14.0)
let image = UIImage(named: icon)
imageView = UIImageView(image: image!)
imageView.frame = CGRect(x: 120, y: 10, width: 30, height: 30)
mainTextLabel.tag = 4
rightlabel.tag = 50
imageView.tag = 100
cell.contentView.addSubview(mainTextLabel)
cell.contentView.addSubview(rightlabel)
cell.contentView.addSubview(imageView)
//CUSTOM LABEL END
if(cell != nil)
println("outside")
//FATCHING TAG & RETURN CELL
mainTextLabel = cell.viewWithTag(4) as UILabel
rightlabel = cell.viewWithTag(50) as UILabel
imageView = cell.viewWithTag(100) as UIImageView
return cell
// FATCHING TAG & RETURN CELL END
【问题讨论】:
您是在情节提要中使用原型单元格还是以其他方式针对重用标识符注册了类/笔尖?如果是这样,那么dequeueReusableCellWithIdentifier
将永远不会返回 nil。您在 if cell==nil
中的代码也没有意义 - 在未注册单元类或 nib 的传统方法中,在这种情况下您不调用 dequeueReusableCellWithIdentifer:indexPath:
,您实际上需要分配一个新单元跨度>
是的,我在故事板中使用原型单元
我更改我的代码并将 cell = tableView.dequeueReusableCellWithIdentifier("detailsCell") 删除为? UITableViewCell 并将其添加到 if 单元格 != nil ,现在我得到 nil 值,但它没有进入 if 条件
不,如果您使用原型单元格,您只需调用 dequeueReusableCellWithIdentifier:
并且您永远不会得到 nil - 所以所有添加文本字段等都应该通过原型单元格中的 Interface Builder 完成。
【参考方案1】:
cell 永远不能为 nil,因为您已经在 // cell content declaration
区域的开始处启动了 cell。所以现在你有一个单元格的实例。因此,它不能再往下为零。再往下,您将引入代码检查 if (cell == nil)。因此,代码永远不会被调用。
或者换句话说,您正在尝试冗余地重新实例化单元格。摆脱第一个:
cell = tableView.dequeueReusableCellWithIdentifier("detailsCell") as? UITableViewCell
你下面的代码会被调用。
此外,第二个条件(单元格!= nil)将始终评估为“是”,因为此时您将以一种或另一种方式创建单元格实例。所以你可能也想摆脱那个测试。
【讨论】:
我从 ` // 单元格内容声明 ` 中删除了这一行cell = tableView.dequeueReusableCellWithIdentifier("detailsCell") as? UITableViewCell
,我得到 nil 值但 if (cell == nil) 下的代码不起作用
所以,首先,您最初的问题似乎得到了解答。如果您将我的回答标记为正确,我将不胜感激;-) 其次,请确保您以正确的顺序做事。 1.) 获取一个单元格(现在可以使用) 2.) 创建子视图并将它们添加到单元格 3.) 为这些视图分配值 层次结构是这样的:单元格包含子视图,子视图具有属性。我认为你搞砸了订单。以上是关于在 swift 中初始化时 tableview 的单元格不是 nil的主要内容,如果未能解决你的问题,请参考以下文章
如何初始加载 UITableView 然后观察 Firebase 节点以更改在 Swift 中刷新 tableview?
swift中tableView的单元格高度扩展时更改标签文本
拖动到视图顶部时,UILongPressGestureRecognizer 在 tableview 中崩溃 - SWIFT