2017-08-29 41 views
19

Problem jest podobny do tytułu. Oto mój kod. I znajdę pracę, przesuń palcem od prawej do lewej, aby usunąć bezpośrednio, to nowa funkcja w iOS11Awaria podczas przesuwania w celu szybkiego i ciągłego usuwania komórki z UITableView w iOS11

let model = self.customRules.remove(at: indexPath.row) //delete datasource 
self.dao.delete(model: model) //delete data in database 
tableView.beginUpdates() //still crash no matter the line exists or not 
tableView.deleteRows(at: [indexPath], with: .left) //delete cell view 
tableView.endUpdates() 

To dziennik katastrofy.

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView internal inconsistency: the _swipedIndexPath cannot be nil if the swipe to delete row is being deleted in _updateRowsAtIndexPaths:withUpdateAction:rowAnimation:usingPresentationValues:' 

Last Exception Backtrace: 
0 CoreFoundation      0x000000018710fd50 <redacted> + 148 
1 libobjc.A.dylib      0x0000000186624528 objc_exception_throw + 56 
2 CoreFoundation      0x000000018710fc0c <redacted> + 0 
3 Foundation       0x0000000187a9bb44 <redacted> + 112 
4 UIKit        0x00000001907c52b8 <redacted> + 648 
5 UIKit        0x00000001906819e4 <redacted> + 140 
...... 
+0

Czy masz dziennik awarii? Ponadto, skąd wiadomo, że to błąd systemu iOS 11? Czy używasz tego kodu w poprzedniej wersji? –

+0

Czy możesz podać całą swoją implementację delegata? – iGenio

+0

Wygląda na to, że iOS 11.2 rozwiązuje ten problem. – PatrickDotStar

Odpowiedz

3

Twój kod wydaje się być OK, ale w Xcode 9 wystąpił błąd z usunięciem komórek. Jeśli spróbujesz swojego kodu w Xcode 8, prawdopodobnie to zadziała. Kasa this odpowiedź, aby uzyskać więcej informacji.

+0

Dziękuję bardzo. Ale nasz projekt wymaga pewnych funkcji iOS11. –

+0

@VictorChoy, musisz poczekać, aż Jabłka naprawi ten problem. W międzyczasie możesz upewnić się, że pobrałeś najnowszą wersję Xcode 9 i masz nadzieję, że problem zostanie wkrótce rozwiązany. –

+0

Jest to odpowiedź typu "ling-only", czyli komentarz. –

0

Spróbuj użyć mojego przykładu.

class ViewController: UIViewController { 

    @IBOutlet weak var tableView: UITableView! 

    var data = ["Byba", "Boba", "Gent", "Xpa", "zc", "123", "swipe", "gen", "sw", "xcas", "kjs", "908"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 


} 

// MARK: - UITableViewDelegate 
extension ViewController: UITableViewDelegate { 

    func tableView(_ tableView: UITableView, titleForDeleteConfirmationButtonForRowAt indexPath: IndexPath) -> String? { 
     return "delete" 
    } 

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

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
     if editingStyle == .delete { 
      tableView.beginUpdates() 
      data.remove(at: indexPath.row) 
      tableView.deleteRows(at: [indexPath], with: .left) 
      tableView.endUpdates() 
     } 
    } 
} 

// MARK: - UITableViewDataSource 
extension ViewController: UITableViewDataSource { 

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

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = UITableViewCell() 
     let item = data[indexPath.row] 

     cell.textLabel?.text = item 

     return cell 
    } 
}