iOS:如何在不在故事板中实际拥有单元格的情况下将可重复使用的"默认"单元格出列

OMG*_*POP 35 cocoa-touch uitableview uikit ios

我有几个表默认单元格,例如带标题的单元格,或左侧带图标的单元格和右侧标题.

我不想在故事板中添加这些单元格并为其分配标识符,是否可以这样做?

它必须是可重用的,我知道如何分配新的不可重用的单元格

我试过下面的答案,

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];
Run Code Online (Sandbox Code Playgroud)

应该是正确的,但这是非常乏味的,很容易忘记

UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Run Code Online (Sandbox Code Playgroud)

以上可能更好,因为它将所有代码放在一个地方,但是当我尝试dequeueReusableCellWithIdentifier:forIndexPath :(使用indexPath)时它会崩溃.

  1. 为什么dequeueReusableCellWithIdentifier:forIndexPath崩溃而dequeueReusableCellWithIdentifier没有?
  2. 如果我没有传入indexPath,那么该单元是否可重用
  3. 如果它是可重用的,那么使用dequeueReusableCellWithIdentifier:forIndexPath?

Flo*_*rel 51

如果故事板中没有任何原型单元格,则可以使用dequeueReusableCellWithIdentifier:api创建经典单元格

UITableViewCell *cell =  [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (!cell) {
   cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
}
Run Code Online (Sandbox Code Playgroud)

迅速:

var cell : UITableViewCell!
cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
    cell = UITableViewCell(style: .default, reuseIdentifier: cellIdentifier)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果使用dequeueReusableCellWithIdentifier:方法,则无需注册类.但是,如果使用dequeueReusableCellWithIdentifier,则需要注册:forIndexPath:两种方法都会为您提供可重用的单元格,但前一种方法会为您实例化它,因此您需要拥有一个已注册的类或原型单元格.第一种方法将在重用堆栈中获取具有给定标识符的单元格,如果不存在则返回nil,则必须自己实例化该单元格 (13认同)

Joe*_*yer 13

您可以在故事板中没有原型单元格的情况下将UITableViewCell出列.您需要在表中注册单元格以获取特定标识符(字符串).你会这样做:

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];
Run Code Online (Sandbox Code Playgroud)

你可以这样做viewDidLoad,也许吧.

然后,您可以cellForRowAtIndexPath像往常一样使用方法中的标识符将单元格出列.

编辑:

哪里MyCellIdentifier是你在什么地方定义,当然,一个常数.


Nik*_*Kov 13

Swift 3.0

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell: UITableViewCell = {
    guard let cell = tableView.dequeueReusableCell(withIdentifier: "cell") else {
        return UITableViewCell(style: .default, reuseIdentifier: "cell")
        }
        return cell
    }()

    cell.textLabel?.text = anyArray[indexPath.row]

    return cell
}
Run Code Online (Sandbox Code Playgroud)

这很好,因为给细胞打开了.