web-dev-qa-db-ja.com

iOS:ストーリーボードにセルを実際に持たずに再利用可能な「デフォルト」セルをデキューする方法

タイトルが付いたものや、左側にアイコンがあり右側にタイトルが付いたものなど、デフォルトのセルがいくつかあります。

これらのセルをストーリーボードに追加して識別子を割り当てたくないのですが、それは可能ですか?

再利用可能でなければならず、新しい再利用不可能なセルを割り当てる方法を知っています

以下の回答を試しましたが、

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];

正しいはずですが、非常に退屈で簡単に忘れてしまいます

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

上記の方法はすべてのコードを1か所に配置するのでより良いかもしれませんが、dequeueReusableCellWithIdentifier:forIndexPath:(indexPathを使用)を試みるとクラッシュします。

  1. dequeueReusableCellWithIdentifierがクラッシュしないのに、dequeueReusableCellWithIdentifier:forIndexPathがクラッシュするのはなぜですか?
  2. indexPathを渡さない場合、セルは再利用可能です
  3. 再利用可能な場合、dequeueReusableCellWithIdentifier:forIndexPathの使用は何ですか?
33
OMGPOP

ストーリーボードにプロトタイプセルがない場合は、dequeueReusableCellWithIdentifier:apiを使用してクラシックセルを作成できます。

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

迅速:

var cell : UITableViewCell!
cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)
if cell == nil {
    cell = UITableViewCell(style: .default, reuseIdentifier: cellIdentifier)
}
48
Florian Burel

ストーリーボードにプロトタイプセルがなくても、UITableViewCellをデキューできます。特定の識別子(文字列)のテーブルにセルを登録する必要があります。これは次のようにします。

[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:MyCellIdentifier];

たぶんviewDidLoadでこれを行うことができます。

その後、通常どおりcellForRowAtIndexPathメソッドでその識別子を使用してセルをデキューできます。

編集:

もちろん、MyCellIdentifierはどこかで定義した定数です。

12
JoeFryer

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
}

セルをラップ解除するので、それは良いことです。

11
Nik Kov

セルをデキューする必要があり、nilを取得した場合は作成します。セルのxibファイルで、その識別子を定義します。

nibファイルにセル識別子を設定:

Set cell identifier

再利用可能なセルを取得するか、新しいセルを作成します:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"myCell";
    MyCell *cell = (MyCell *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        NSArray *t = [[NSBundle mainBundle] loadNibNamed:@"myCellXibFileName" owner:nil options:nil];
        for (id currentObject in t)
        {
            if ([currentObject isKindOfClass:[MyCell class]])
            {
                cell = (MyCell *)currentObject;
                break;
            }
        }
    }
    // Do whatever you want with the cell....
    return cell;
}
1
Aviel Gross

コンポーネントライブラリを開き、UITableViewCellをTableViewストーリーボードにドラッグし、このセルを選択してIDインスペクターを開き、必要なデフォルトスタイルを選択し、コードでdequeueReusableCellWithIdentifierと同じセル識別子を設定します。

0
Linc