gpt4 book ai didi

ios - 删除导致应用程序崩溃

转载 作者:行者123 更新时间:2023-11-29 01:56:43 25 4
gpt4 key购买 nike

我正在尝试组装我的第一个 iOS 应用程序(我主要是一名 PHP 开发人员),但我遇到了一个问题。我试图按照教程制作一个简单的任务管理器应用程序,除了删除功能外,我的一切都正常工作。

当我尝试删除一个项目时,应用程序崩溃并出现以下错误:

2015-06-10 08:33:32.532 Tasks[56594:1355112] *** Assertion failure in
-[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-3347.44/UITableView.m:1623

2015-06-10 08:33:32.538 Tasks[56594:1355112] *** Terminating app due to uncaught exception
'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in
section 0. The number of rows contained in an existing section after the update (1) must
be equal to the number of rows contained in that section before the update (1), plus or
minus the number of rows inserted or deleted from that section (0 inserted, 1 deleted) and
plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'

如果需要,我也可以发布之后的抛出调用堆栈消息。

这是我的 MasterViewController.swift 文件:

//
// MasterViewController.swift
// Tasks
//
// Created by John Doe on 6/9/15.
// Copyright (c) 2015 John Doe. All rights reserved.
//

import UIKit

class MasterViewController: UITableViewController {

var objects = [Task]()

var count: Int {
return objects.count
}

override func awakeFromNib() {
super.awakeFromNib()
}

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

override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated);
self.objects = TaskStore.sharedInstance.tasks;
self.tableView.reloadData();
}

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

// MARK: - Segues

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "showDetail" {
if let indexPath = self.tableView.indexPathForSelectedRow() {
let task = TaskStore.sharedInstance.get(indexPath.row)
(segue.destinationViewController as! DetailViewController).detailItem = task
}
}
}

// MARK: - Table View

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}

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

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

let task = TaskStore.sharedInstance.get(indexPath.row)
cell.textLabel?.text = task.title
cell.detailTextLabel?.text = task.notes
return cell
}

override func tableView(tableView: UITableView, canEditRowAtIndexPath indexPath: NSIndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return true
}

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
TaskStore.sharedInstance.removeTaskAtIndex(indexPath.row)
tableView.beginUpdates()
tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
tableView.endUpdates()
} else if editingStyle == .Insert {
// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}


}

一位 friend 提到我应该在删除代码前后添加 beginUpdates() 和 endUpdates() 方法,但我仍然收到相同的错误消息并崩溃。

如有任何建议,我将不胜感激,我觉得通读引用资料对我没有任何帮助。谢谢!

最佳答案

beginUpdates()endUpdates()无关;如果您同时需要多个动画(在第 1 节中插入 x 行,在第 2 节中删除 y 行),则使用这些动画。

您的问题在于您有时使用局部变量 objects,有时使用 TaskStore.sharedInstance。您正在从 TaskStore 中删除任务,但您仍在使用 objects 来确定行数。

最简单的方法是完全摆脱objects,只使用TaskStore.sharedInstance。但是,在某些情况下保留本地副本是有意义的,例如如果您包含“保存”和“取消”按钮。在这种情况下,您应该在 viewDidLoad 中获取对象(就像您现在所做的那样),在其他任何地方使用 objects,当用户单击“保存”时,将更改写回到商店。

关于ios - 删除导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759706/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com