miyazaki-dev

【Swift】メインストーリーボード無しでtableviewのカスタムセルを設定。

Swift

iOSアプリを作成しててtableviewをよく使うかと思います。

でもデフォルトのtableviewだけでは、物足りない。。。となり、カスタムセルを使うのが多くの場合のはず。

メインストーリーボードを使用した場合についてはネット上にもたくさんあったのですが、メインストーリーボード無しのプログラミングのみの場合については、ほとんど記事が見当たらなかったので、メモとして残しておきます。

(独学でだいぶ詰まった。。。)

カスタムセルでtableviewを実装

まずはViewControllerでtableviewを作成します。

コメントアウトで補足してます。

// ViewController.swift
import UIKit

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
  var sampleTableView: UITableView!
    
  override func viewDidLoad() {
    super.viewDidLoad()
        
    // tableviewを作成
    self.sampleTableView = UITableView()
    self.sampleTableView.frame = CGRect(
      x: 0,
      y: 0,
      width: self.view.frame.width,
      height: self.view.frame.height
    )
        
    // 設定するカスタムセルを指定。
    // 今回はSampleCustomCellというクラスを参照させる。(後述)
    self.sampleTableView.register(
      SampleCustomCell.self,
      forCellReuseIdentifier: "SampleCustomCell"
    )
    self.sampleTableView.dataSource = self
    self.sampleTableView.delegate = self
    self.view.addSubview(self.sampleTableView)
  }

  // とりあえず、データ数を50に。
  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 50
  }
    
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // セルのインスタンスの作成
    let cell = tableView.dequeueReusableCell(
      withIdentifier: "SampleCustomCell",
      for: indexPath as IndexPath
    ) as! SampleCustomCell
    // cellオブジェクトのプロパティのsampleLabelに値をセット。
    cell.sampleLabel.text = String(indexPath.row)
    return cell
  }
    
  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
  }
}

SampleCustomeCellを設定。

本来はここでゴリゴリカスタマイズをするのですが、今回はただUILabelを設定したのみです。

// SampleCustomCell.swift
import UIKit

class SampleCustomCell: UITableViewCell {
    
  var sampleLabel:UILabel!
  
  required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
  }

  // 引数のないコンストラクタみたいなもの。
  // インスタンスが生成されたときに動く関数
  override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
    super.init(style: style, reuseIdentifier: reuseIdentifier)
    // とりあえず、labelを作成してcontentViewにadd
    self.sampleLabel = UILabel()
    self.sampleLabel.frame = CGRect(
      x: 10,
      y: 0,
      width: self.contentView.frame.width,
      height: self.contentView.frame.height
    )
    self.contentView.addSubview(self.sampleLabel)
  }
}

今回は、UILabelを指定したのみで、デフォルトのカスタムセルと同じでカスタムセルにした意味がありませんが、開発の糸口が見えれば良いかなと思います!

どんな風にカスタムセルをカスタマイズするのかは今後時間のあるときにでも記事にできたらと。

以上!