如何在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 }