miyazaki-dev

【Swift】tableViewでデリートしてデータが0のときに無しと表示する。

Swift

tableviewでセルを消していき、参照データがゼロになったときに「データないよ」と表示しようと思ったものの

「libc++abi.dylib: terminating with uncaught exception of type NSException」とエラーを出し続ける…このエラーはなんなんだと悩み

正攻法かはわからないけれど、なんとか解決できたっぽいです。

データゼロのtableview

SwiftでTableViewを消してゼロになったときに表示するコード

メインストーリーボード無しで作っているので、コピペすれば動くはず。

基本的にはtableviewを作成、delete処理のみとなります。

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
  // 元のデータ
  var data:[Int] = [0,1,2]
  var testTableView: UITableView!
    
  override func viewDidLoad() {
    super.viewDidLoad()
    	
    // ごにょごにょとtableviewを作成
    let width: CGFloat = self.view.frame.width
    let height: CGFloat = self.view.frame.height

    self.testTableView = UITableView(frame: CGRect(x: 0, y: 0, width: width, height: height))
    self.testTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
    self.testTableView.dataSource = self
    self.testTableView.delegate = self
    self.view.addSubview(self.testTableView)
  }

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
  // 参照するデータがゼロのときには1を返す。(データがないよと表示するため。)
    if self.data.count == 0 {
      return 1
    }else{
      return self.data.count
    }
  }
    
  func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    // セルのインスタンスの作成
	let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath as IndexPath)
	// データがゼロのときは、データないよと表示する。
    if self.data.count == 0 {
      cell.textLabel!.text = "データないよ"
      return cell
    }else{
      // データがあるときは数字を表示
      cell.textLabel!.text = "\(self.data[indexPath.row])"
      return cell
    }
  }
    
  // tableviewのデリートに対する処理
  func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
      // 兎にも角にもまずはデータを削除
      self.data.remove(at: indexPath.row)
      // データがゼロだったときは、tableviewをリロード。
      if self.data.count == 0 {
        self.testTableView.reloadData()
        // self.testTableView.reloadRows(at: [indexPath], with: .fade)
        // というそれっぽい関数もあって試したんですが、なんか変な表示になるってことでリロードしときました。
      }else{
        self.testTableView.deleteRows(at: [indexPath], with: .fade)
      }
    }
  }
    
  override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
  }
}

tableviewでデータがゼロになってときにエラーを起こす原因

一応、どっかのサイト見た受け売りですが、

self.testTableView.deleteRows(at: [indexPath], with: .fade)ってtableviewから削除する関数があるのですが、どうもこれが悪さ?をしてるらしい。

この関数内部で勝手にデータがゼロのときは、セルの数(データの数)がゼロと処理するとのこと。

それなのにも関わらず僕は必ずデータは1以上あるように処理してるため、deleteRowsさんが「お前データねえのにセルの数1とか嘘つくんじゃねえよ!!」と怒られてるみたいですね。

これで急にクラッシュすることはなくなった。。。はず。

終わり!

じゃーの。