Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样

今天在看官方的TableView Guide,突然想起来最近写的一个代码中实现tableViewCell复用的时候有点问题:

var cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: identifer)

cell.textLabel.text = myPeripherals[indexPath.row].name

这里可以看出来,每次调用tableView:cellForRowAtIndexPath: 时都会新建一个cell对象,这样肯定是不好的。

在OC中的正统的实现方式应该是:

先是用dequeueReusableCellWithIdentifier去将队列中已有的cell,则将其取出,重新利用。

如果cell为nil,则重新实例化一个TableViewCell对象,再使用~~~~

所以这样我就像将我有问题的Swift代码改回来,如下:

但是这样会崩溃,不管是写成optional value的形式:

var cell? = tableView.dequeueReusableCellWithIdentifier(identifer) as? UITableViewCell

都会报同样的错误,搞了半天才发现,原来这个错误不是cell == nil导致的,因为“Create new cell”没有被输出过。

出错的原因就在cell.detailTextLabel上出现,说明cell没有被设置成Subtitle的风格。

再去看苹果官方的TableViewSuite Sample Code,中对tableViewCell的调用发现

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *MyIdentifier = @"MyIdentifier";

    /*
     Retrieve a cell with the given identifier from the table view.
     The cell is defined in the main storyboard: its identifier is MyIdentifier, and  its selection style is set to None.
     */
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];

    // Set up the cell.
    NSString *timeZoneName = [self.timeZoneNames objectAtIndex:indexPath.row];
    cell.textLabel.text = timeZoneName;

    return cell;
}

这里也是直接调用dequeueReusableCellWithIdentifier:MyIdentifier函数,没有在实例化一个tableViewCell对象。

这里也对这个进行了一定的说明:

/* Retrieve a cell with the given identifier from the table view. The cell is defined in the main storyboard: its identifier is MyIdentifier, and its selection style is set to None. */
再加上苹果官方TableView Guide文档中写到:

If the dequeueReusableCellWithIdentifier: method asks for a cell that’s defined in a storyboard, the method always returns a valid cell. If there is not a recycled cell waiting to be reused, the method creates a new one using the information in the storyboard itself. This eliminates the need to check the return value for nil and create a cell manually.

就是用dequeueReusableCellWithIdentifier:MyIdentifier函数会一直得到一个有效的在storyboard中定义的cell,而且用storyboard中所定义的信息去设置这个cell,这样就省去了每次去检测cell是否是nil,再去手动的创建。

从这里可以看到,我的代码中出现的错误就是在storyboard中没有将cell设置为subtitle的样式,否则应该不会出错。

所以下面这种方式是最简单的:

var identifer: String = "myCell"
var cell = tableView.dequeueReusableCellWithIdentifier(identifer) as UITableViewCell
cell.textLabel.text = a[indexPath.row].name
cell.detailTextLabel.text = "detail"

但是要注意,这样方式需要在storyboard中设置好cell的一些必要的属性。

如果是这样,那自定义cell又该如何实现呢?(待续。。。。)

时间: 2024-08-07 20:49:25

Swift TabeleViewCell dequeueReusableCellWithIdentifier 使用的新的细节,原来现在可以这样的相关文章

Swift 2.0 到底「新」在哪?

[编者按]2015年6月,一年一度的苹果 WWDC 大会如期而至,在大会上苹果发布了 Swift 2.0,引入了很多新的特性,以帮助开发者更快.更简单地构建应用.本篇文章作者是 Maxime defauw ,本文中 Maxime 向大家简要介绍 Swift 2.0 中值得注意的新特性.本文系 OneAPM 工程师编译整理. 一年前,苹果推出了面向 iOS 和 OS X 的全新编程语言-- Swift.当听到它发布的时候,像千千万万 iOS 开发者那样,笔者的内心激动无比.正如宣传所说的那样,作为

Swift 3必看:新的访问控制fileprivate和open

在swift 3中新增加了两中访问控制权限 fileprivate和 open.下面将对这两种新增访问控制做详细介绍. fileprivate 在原有的swift中的 private其实并不是真正的私有,如果一个变量定义为private,在同一个文件中的其他类依然是可以访问到的.这个场景在使用extension的时候很明显. class User { private var name = "private" } extension User{ var accessPrivate: St

Swift 3.1 的一些新特性

Apple终于发布了Xcode 8.3以及Swift 3.1.如果你没时间仔细通读一遍release note,至少,Swift 3.1中的一些新特性还是值得了解的,为此,我们特别制作了一个免费的内容系列.当然,Swift 3.1和Swift 3在源代码级别是兼容的,因此,如果你的项目已经更新到了Swift 3,这次更新应该不会给你带来太多麻烦.但是,Xcode 8.3去掉了对Swift 2.3的支持,所以,如果你还停留在更早版本的Swift上,就还是谨慎更新的为好. 接下来,我们就简单介绍下这

iOS开发——新特性篇&swift新特性(__nullable和__nonnull)

swift新特性(__nullable和__nonnull) 最近在看老师写代码的时候经常遇到两个陌生的关键字,但是当我在我的电脑上敲得时候就是敲不出,后来才知道这是为了swift与OC混编的时候产生的一个新特性,就很认真的研究了一下. 在swift中,可以使用!和?来表示一个对象是optional的还是non-optional,如view?和view!.而在Objective-C中则没有这一区分,view即可表示这个对象是optional,也可表示是non-optioanl. 这样就会造成一个

[转]Swift 2.0初探:值得注意的新特性

转自http://www.cocoachina.com/swift/20150623/12231.html 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语

Swift 2.0初探:值得注意的新特性

转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不同的是,guard语句只会

现代的新语言--Swift初探

新的语言 WWDC简短的介绍,新的语言Swift就问世了,虽然新语言的名字导致贴吧下歌手粉丝和开发者们争抢地盘- -,不过雨燕就是这么来了. WWDC keynote里给Swift打上了很多标签: Closures,Generics,Namespaces,Type inference,Multiple return types 闭包,泛型支持,支持命名空间,去除隐式类型转换,多返回值等这些优秀的特性让这门语言显得现代和便捷,再加上学习了很多其他语言类似Go,JavaScript等等的优秀语法,它

iOS开发——新特性OC篇&Swift 2.0新特性

Swift 2.0新特性 转眼间,Swift已经一岁多了,这门新鲜.语法时尚.类型安全.执行速度更快的语言已经渐渐的深入广大开发者的心.我同样也是非常喜爱这门新的编程语言. 今年6月,一年一度的WWDC大会如期而至,在大会上Apple发布了Swift 2.0,引入了很多新的特性,以帮助开发者能更快,更简单的构建应用.我在这里也说道说道Swift 2.0中值得大家注意的新特性. guard语句 guard语句和if语句有点类似,都是根据其关键字之后的表达式的布尔值决定下一步执行什么.但与if语句不

[转]Swift 3 新特性

文/mango_To(简书作者)原文链接:http://www.jianshu.com/p/dc80e290806f 前言 Swift 3今年晚些时候会与大家见面,它会带给Swift开发者巨大的代码层面的改变.如果你最近没有跟进Swift Evolution的步伐,你也许会问到底有啥变化,它会怎样影响你的代码,以及你什么时候应该迁移到Swift 3上来.那么这篇文章会为你一一解答.在这篇文章中,我会着重强调Swift 3中最重要的变化,因为这些会影响你的代码.我们一起来深掘吧! 开始 现在Swi