了解Swift中的实例化 - 为什么不在自定义类中需要

时间:2015-11-11 12:39:23

标签: ios swift uitableview swift2

据我所知,在Swift中你不需要导入你的课程(仅适用于某些框架),但需要进行入学,但令我惊讶的是,这可能不是真的,我创建了一个自定义类({{ 1}})对于我在UITableView中使用的自定义单元格,显然在使用之前不需要创建自定义类的实例。以下是我使用它的方式。

CustomCell Class

CustomCell.swift

查看控制器

//  CustomCell.swift

import UIKit

class CustomCell: UITableViewCell {

    @IBOutlet weak var labelDisplayWattage: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

正如您所看到的,// ViewController.swift import UIKit class ViewController: UIViewController, UITableViewDataSource { // some code ... func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as! CustomCell cell.labelDisplayWattage.text = String(totalWattageList[indexPath.row]) return cell } } 类没有针对方法CustomCellcellForRowAtIndexPath)调用的实例。

有人可以告诉我为什么在方法as! CustomCell中使用它之前不需要创建类CustomCell的实例?我期待看到类似......

cellForRowAtIndexPath

由于

3 个答案:

答案 0 :(得分:2)

根据数据源方法的苹果文档

 func dequeueReusableCellWithIdentifier(_ identifier: String,forIndexPath indexPath: NSIndexPath) -> UITableViewCell 
  

出于性能原因,通常应该使用表视图的数据源   在将单元格分配给其中的行时,重用UITableViewCell对象   tableView:cellForRowAtIndexPath:方法。表视图维护一个   数据源具有的UITableViewCell对象的队列或列表   标记为重用。何时从数据源对象中调用此方法   要求为表格视图提供新单元格。 此方法出列   现有单元格(如果有单元格可用),或基于创建新单元格   您之前注册的类或nib文件,并将其添加到   表

所以基本上如果队列为空,它会为你创建一个新对象。

来源: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableView_Class/#//apple_ref/occ/instm/UITableView/dequeueReusableCellWithIdentifier:forIndexPath

答案 1 :(得分:1)

let cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as! CustomCell

CustomCell的实例化是tableview的责任,我们只是获取单元格,如果在我们获取它时未实例化单元格,则tableview将在将其返回给我们之前对其进行实例化。

此行为属于架构设计,并非特定于swift。对于objective-c,它也以相同的方式工作。

答案 2 :(得分:1)

您现在看到的代码下面有一个非常重要的概念。如果您正在使用故事板,则表视图和集合视图可以选择使用原型单元。原型单元格是可以/将与表视图或集合视图一起使用的单元格的模板。如果您的表/集合视图设置为使用原型单元格,则无需创建新单元格,UIKit会在您通过调用tableView.dequeueReusableCellWithIdentifier请求排队的单元格时为您创建一个单元格

使用原型单元格 NOT 时请考虑以下事项:

//  ViewController.swift
import UIKit

class ViewController: UIViewController, UITableViewDataSource {

// some code ...

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("reusableCell", forIndexPath: indexPath) as? CustomCell
        if nil == cell {
            cell = CustomCell()
            // more cell options can be set here
        }
        cell.labelDisplayWattage.text = String(totalWattageList[indexPath.row])
        return cell
    }

}