gpt4 book ai didi

swift - 寻找一种更通用的 UITableViewCells 出队方法

转载 作者:可可西里 更新时间:2023-11-01 01:07:17 29 4
gpt4 key购买 nike

研究这个主题我发现了以下代码:

protocol ReusableView {

static var reuseIdentifier: String { get }
}

extension ReusableView {

static var reuseIdentifier: String {
return String(describing: self)
}
}
extension UITableViewCell: ReusableView {}

extension UITableView {

func dequeueReusableCell<T: UITableViewCell>(for indexPath: IndexPath) -> T {
guard let cell = dequeueReusableCell(withIdentifier: T.reuseIdentifier, for: indexPath) as? T else {
fatalError("Unable to Dequeue Reusable Table View Cell")
}

return cell
}
}

Like here suggested

我的问题是,尽管 Storyboard中定义的所有原型(prototype)单元格都有唯一的 ReuseIdentifier,但 T.reuseIdentifier 始终相同:UITableViewCell。

即使我定义了以下代码

class c1 : UITableViewCell {}
class c2 : UITableViewCell {}
class c3 : UITableViewCell {}

并将c1,c2,c3赋给三个原型(prototype)cell,返回值仍然是UITableViewCell。因此,显示的示例似乎是概括主题的好方法,但缺少某些内容。

这是我调用出列方法的代码:

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCell(for: indexPath)

// Configure the cell...
let place = places[indexPath.row]
cell.textLabel?.text = place.name
cell.detailTextLabel?.text = "\(place.timestamp)"
return cell
}

最佳答案

您需要在调用该方法时指定您想要的表格 View 单元格类型:

let cell: c1 = dequeueReusableCell(for: indexPath)

链接教程的后面部分也提到了这一点:

Remember that we leverage generics and type inference. We want to dequeue a WeatherDayTableViewCell instance, not a UITableViewCell instance. But how should the compiler know that we want to dequeue a WeatherDayTableViewCell instance? The compiler tries to infer the type of the cell constant we define in tableView(_:cellForRowAt:). It sees that we return cell from tableView(_:cellForRowAt:) and, by inspecting the method definition, it infers that cell should be of type UITableViewCell. The compiler is correct. The solution is very simple. When we declare the cell constant, we need to explicitly specify its type. The compiler then understands that the dequeueReusableCell(for:) method should return a WeatherDayTableViewCell instance.

此外,我认为使用 String(describing: self) 获取类名是一种糟糕的方式。如果 self 实现了 CustomStringConvertible 并具有自定义 description 属性,这可能会破坏您的代码。更好的方法是使用:

return String(describing: Self.self)

关于swift - 寻找一种更通用的 UITableViewCells 出队方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55932558/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com