如何在Swift中设置UITableViewCellStyleSubtitle和dequeueReusableCell?

我想要一个带有使用dequeueReusableCellWithIdentifier subtitle式单元格的UITableView

我最初的Objective-C代码是:

 static NSString* reuseIdentifier = @"Cell"; UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; if(!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:reuseIdentifier]; } 

在search了这里的几个UITableView问题后,我想这样写在Swift中:

  tableView.registerClass(UITableViewCell.classForCoder(), forCellReuseIdentifier: "Cell") let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell 

但是,这不让我说我想要一个subtitle风格。 所以我试过这个:

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

这给了我一个subtitle单元格,但它不让我dequeueReusableCellWithIdentifier

我已经研究了一些,看了这个video教程 ,但他创build了UITableViewCell一个单独的subclass ,我认为是不必要的,因为我以前在Obj-C中完成了相同的效果。

有任何想法吗? 谢谢。

请记住, UITableView被定义为函数中的一个可选项,这意味着您的初始单元格声明需要检查属性中的可选项。 另外,返回的排队单元格也是可选的,所以确保你对UITableViewCell进行可选的转换。 之后,我们可以强制解包,因为我们知道我们有一个单元格。

 var cell:UITableViewCell? = tableView?.dequeueReusableCellWithIdentifier(reuseIdentifier) as? UITableViewCell if (cell == nil) { cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier) } // At this point, we definitely have a cell -- either dequeued or newly created, // so let's force unwrap the optional into a UITableViewCell cell!.detailTextLabel.text = "some text" return cell 

基本上和其他答案一样,但是我使用一个计算variables来处理讨厌的optionals(你不能从-tableView:cellForRow:atIndexPath: in Swift中返回nil ):

Swift 3

 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell: UITableViewCell = { guard let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell") else { // Never fails: return UITableViewCell(style: UITableViewCellStyle.value1, reuseIdentifier: "UITableViewCell") } return cell }() // (cell is non-optional; no need to use ?. or !) // Configure your cell: cell.textLabel?.text = "Key" cell.detailTextLabel?.text = "Value" return cell } 

编辑:

实际上,使用tableView.dequeueReusableCell(withIdentifier:for:)来代替单元格会更好。

如果没有人可以重用(这正​​是我的代码在上面明确的),这个函数的后面的变体会自动实例化一个新的单元格,因此永远不会返回nil

只是build立在纪念品的答案清理它迅速2风格…

 let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) ?? UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier) cell.detailTextLabel?.text = "some text" return cell 

Swift 3:

 let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier) ?? UITableViewCell(style: .subtitle, reuseIdentifier: cellIdentifier) cell.detailTextLabel?.text = "" return cell 
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let reuseIdentifier = "cell" var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as UITableViewCell? if (cell == nil) { cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: reuseIdentifier) } cell!.textLabel?.text = self.items[indexPath.row] cell!.detailTextLabel?.text = self.items[indexPath.row] return cell! } 

您可以使用与memmons稍微不同的语法来防止强制解包:

 let cell = tableView.dequeueReusableCellWithIdentifier(reuseIdentifier) as? UITableViewCell ?? UITableViewCell(style: .Subtitle, reuseIdentifier: reuseIdentifier) cell.detailTextLabel?.text = "some text" return cell 

这是使用XCode 6.1 7,Swift 1.2 2.0语法,其中UITableView不再是可选的。

我让你看看这个在Github上的小UITableView-Example: https : //github.com/YANGReal/UITableView-Swift

他们的确如下:

 func tableView(tableView: UITableView!, cellForRowAtIndexPath indexPath: NSIndexPath!) -> UITableViewCell! { let cell = tableView .dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as UITableViewCell cell.textLabel.text = String(format: "%i", indexPath.row+1) // set any other property of your cell here return cell } 

完美的Michael G. Emmonsbuild议,但在Xcode 6.1使用

 if !cell { ..... 

我得到这个错误:

可选types“@ | value UITableViewCell?” 不能用作布尔值; testing'!= nil'代替

接受的语法是:

 if cell == nil { ... 
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { var CellIdentifier:String = "Cell" var cell:UITableViewCell? = tableView.dequeueReusableCellWithIdentifier(CellIdentifier) as? UITableViewCell if cell == nil { cell = UITableViewCell(style:UITableViewCellStyle(rawValue:3)!,reuseIdentifier:CellIdentifier) } return cell! } 

这个有点奇怪 我希望tableView会要求我们返回一个单元格,它是用一个单元格标识符注册的。 但是,这似乎并不是这种情况,下面的代码将渲染textLabel和detailTextLabel文本的单元格:

 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: cellId) let user = users[indexPath.row] cell.textLabel?.text = user.name cell.detailTextLabel?.text = user.email return cell } 

由于tableView.dequeueReusableCell(withIdentifier:, for:)返回非零单元格,所以if cell == nil检查总是为false。 但是我find了一个解决scheme,使默认样式单元格成为你想要的样式(value1,value2或者subtitle),因为默认样式单元格的detailTextLabel是零,所以如果它是零,检查detailTextLabel ,然后创build新的样式单元格,出列单元格,如:

Swift 3:

 var cell = tableView.dequeueReusableCell(withIdentifier: yourCellReuseIdentifier, for: indexPath) if cell.detailTextLabel == nil { cell = UITableViewCell(style: .value1, reuseIdentifier: repeatCellReuseIdentifier) } cell.textLabel?.text = "Title" cell.detailTextLabel?.text = "Detail" return cell 

这对我很有用。

希望这是帮助。

如果您不使用自己的自定义单元格。 只需通过代码注册UITableViewCell。 那么你可以更喜欢的代码。

否则select故事板,select您的TableViewCell – >转到属性检查器,并select所需的样式,如下所示。

在这里输入图像说明

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { var cell:UITableViewCell? = tableView.dequeueReusableCell(withIdentifier: "cell") if (cell != nil) { cell = UITableViewCell(style: UITableViewCellStyle.subtitle, reuseIdentifier: "cell") } cell!.textLabel?.text = "ABC" cell!.detailTextLabel?.text = "XYZ" return cell! } 

只要使用这个Swift 3:

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "My Reuse Identifier", for: indexPath) cell.textLabel?.text = "Key" cell.detailTextLabel?.text = "Value" return cell }