56185


tableViewCellをスワイプして削除したいのですが下の画像の様にdeleteを押したら致命的なエラーになる。どの様なコードを追加しなければならないですか。またそれは何故ですか。

[![画像の説明をここに入力](https://i.stack.imgur.com/dx7Ia.png)](https://i.stack.imgur.com/dx7Ia.png)

問題のあるコード↓↓

[code]

    import UIKit
    
    class TableViewController: UITableViewController {
    
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
           tableView.register(UINib(nibName: "TableViewCell", bundle: nil), forCellReuseIdentifier: "customTableViewCell")
    
        }
    
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 1
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "customTableViewCell", for: indexPath) as! TableViewCell
    
            return cell
        }
    
        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    
        }
    
    
        //問題のある部分！
       override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == .delete {
    　　　　　　　//おそらくarray.remove(at: indexPath.row)的な処理が必要であるはず、、
    
                tableView.deleteRows(at: [indexPath], with: .fade)
            }
        }
    
        @IBAction func addSkillButton(_ sender: UIBarButtonItem) {
        }
    
    
        @IBAction func secret(_ sender: UIBarButtonItem) {
        }
    
    
    }
    
    
[/code]


CC BY-SA 4.0
2019-06-28T07:48:28.617
56180
2019-06-28T23:39:59.190
2019-06-28T23:39:59.190
14745
34541
question
swift xcode
tableViewCell の削除について


デバッグコンソールには **Internal Incosistency Exception** という表示がどこかに出ていたのではないでしょうか?
何らかのエラーメッセージが表示されている場合には、致命的なエラーとだけ言わずに、そのメッセージをご質問に含められた方が、より的確なアドバイスをより早く得ることにつながります。

今回の問題に関して言えば、結論はご自身のコメントにあるように「`array.remove(at:
indexPath.row)`的な処理が必要」だと言うことです。

もう少し具体的に言うと、

  1. `tableView(_:numberOfRowsInSection:)`が1を返している

  2. `tableView.deleteRows(at: [indexPath], with: .fade)`で、そのセクション内の行を削除したことがiOS側に伝えられる

  3. iOSはそのセクションの行数が1から1減って0になっているのを期待してるのに、1が返ってくる

  4. 辻褄が合わんやんけ(inconsistent)と怒られる

と言う状況になっています。

**どの様なコードを追加しなければならない**
かと言えば、上記のような場合にも`tableView(_:numberOfRowsInSection:)`が辻褄の合う値を返すようにすること、と言うことになります。ご自身が書かれているように`array`を導入するのも1つの方法でしょう。

[code]

        //↓そのうちもっと複雑なものの配列が必要になるはずだが、お試しコードの間は整数の配列で十分
        var array: [Int] = [1,2,3,4,5]
    
        override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            //`array`が1つ削除されると返される値も1減るから辻褄が合う
            return array.count
        }
    
        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            //`dequeueReusableCell(withIdentifier:)`ではなく、
            //`dequeueReusableCell(withIdentifier:for:)`の方を使う
            //(現在のiOSだと、上の方を使っても「動いているように見える」ことがありますが、
            //他の部分をいじっているうちに突然落ちる、なんてことになります。)
            let cell = tableView.dequeueReusableCell(withIdentifier: "TableViewCell", for: indexPath) as! TableViewCell
    
            cell.skillName.text = "〇〇〇〇〇〇\(array[indexPath.row])"
            cell.goalCountNumber.text = "20 : 00"
    
            return cell
        }
    
        override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
            if editingStyle == .delete {
                array.remove(at: indexPath.row)
                //↑と↓は必ず対にして使う
                tableView.deleteRows(at: [indexPath], with: .fade)
            }
        }
    
[/code]

**Internal Incosistency Exception**
と言う奴は、少々慣れていても、「なんであかんのかわかれへん」と言うことがよくあるんですが、今回のあなたのコードだと明らかですね。


CC BY-SA 4.0
2019-06-28T11:06:24.347
56185
2019-06-28T11:06:24.347
13972
56180
answer