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

 

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

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

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

 

Swift4で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とか嘘つくんじゃねえよ!!」と怒られてるみたいですね。

 

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

終わり!

 

じゃーの。

Follow
SHARE