2017-09-22 19 views
1

私はtableViewで作業していますが、今は行を削除する機能を実装しましたが、行を削除した後にこのエラーでアプリがクラッシュしました(致命的なエラー:スウィフトエラー:インデックスが範囲外です

struct User { 

     var name: String 
     var images: UIImage 
     var coordinate : (Double , Double) 
     var type: String 
     var address: String 
    } 


     var users = [User]() 




override func viewDidAppear(_ animated: Bool) { 
      super.viewDidAppear(animated) 
      rows = 0 
      tableView.reloadData() 
      insertRowsMode3() 
    } 

     @IBAction func refreshTapped(_ sender: Any) { 

      rows = 0 
      tableView.reloadData() 
      insertRowsMode3() 
     } 

     func insertRowsMode2() { 

      for i in 0..<users.count { 
       insertRowMode2(ind: i, usr: users[i]) 
      }    
     } 

     func insertRowMode2(ind:Int,usr:User) { 

      let indPath = IndexPath(row: ind, section: 0) 

      rows = ind + 1 
      tableView.insertRows(at: [indPath], with: .right) 
     }   

     func insertRowsMode3() { 

      rows = 0    
      insertRowMode3(ind: 0) 
     } 

     func insertRowMode3(ind:Int) { 

      let indPath = IndexPath(row: ind, section: 0)       
      rows = ind + 1      
      tableView.insertRows(at: [indPath], with: .right)       

      guard ind < users.count-1 else { return } 
      DispatchQueue.main.asyncAfter(deadline: .now()+0.20) {     
       self.insertRowMode3(ind: ind+1) 
      } 
     } 

     func numberOfSections(in tableView: UITableView) -> Int {   
      return 1 
     }   

     func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {    
      return rows 
     } 

     public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

      let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell 

      let user = users[indexPath.row] 

      cell.selectionStyle = .none 

      cell.myImage.image = user.images 
      cell.myLabel.text = user.name 
      cell.myTypeLabel.text = user.type 
      return (cell) 
     } 

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

      tableView.deselectRow(at: indexPath, animated: true) 

      UIView.animate(withDuration: 0.2, animations: { 
      let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell 
      }) 

      performSegue(withIdentifier: "goToLast" , sender: users[indexPath.row]) 

     } 

     func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 
      return 100 
     } 

     func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { 
      return true 
     } 

     func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 

      if editingStyle == UITableViewCellEditingStyle.delete { 

       users.remove(at: indexPath.row) 
       tableView.reloadData() 

      }   
     } 

これが私のtableViewのコードの一部であり、私は何ができるか、私は、アプリケーションがクラッシュに行く理由を私は知っていると思うが、私はこの問題を解決する方法がわかりませんか?

+0

と と 更新、削除コードやあ、(時:indexPath.row)users.remove? –

+1

numberOfRowsInSection' 'ではなくrows'リターンを返す'より'return users.count'。行数の手動計算はかなり誤りがちです。 – vadian

+0

@ S.Wei right!私は質問を編集しました – bero

答えて

0

return rows返信return users.count @@ vadianのコメントではなく、numberOfRowsInSectionasを更新してください。 VaRのユーザーから来るんこのライン、この

users.remove(at: indexPath.row) 
tableView.deleteRows(at: [indexPath], with: .fade) 
+0

私は返すusers.countで返す行を更新する場合は、ビューのロード時にクラッシュに行く – bero

+1

はい、tablviewデリゲートは、代理人とデータソースは、ユーザーにはデータがありません。 plsはnibからデリゲートとデータソースの接続を削除し、tableView.reloadData()の前にそれらを追加し、 "users"配列または配列数> 0のデータを持っているときにこれらのメソッドを呼び出します。 – Rivendell

+0

今、 – bero

関連する問題