【发布时间】:2018-06-01 19:00:28
【问题描述】:
我正在使用 UICollectionViewController,我正在尝试在所选项目的循环中使用 deleteItems,如下所示:
for item in (collectionView?.indexPathsForSelectedItems)!
{
let cell = self.collectionView?.cellForItem(at: item) as! ImageCollectionCell
deleteLandGradingImage(images: ImagesData(jobNo: self.jobNo, ImageBytes: (self.array[item.item]["imageBytes"] as! String), Username: appDelegate.username)) { result in
cell.imageView.layer.borderWidth = 0
self.navigationItem.rightBarButtonItems = [self.editButton]
self.editButton.isEnabled = true
self.editButton.title = "Edit"
self.doneButton.title = "Done"
self.array.remove(at: item.item)
self.collectionView?.deselectItem(at: item, animated: true)
self.collectionView?.deleteItems(at: [item])
}
}
deleteLandGradingImage(images: ImagesData(jobNo: self.jobNo, ImageBytes: (self.array[item.item]["imageBytes"] as! String), Username: appDelegate.username)) { result in
}
是对删除单元格内的图像并将其从数据库中删除的 API 的调用。
func deleteLandGradingImage(images: ImagesData, completionHandler:@escaping (_ result:Bool) -> Void) {
//Define array for returning data
var returnedResults = Bool()
//Call API
WebService().deleteLandGradingImages(images: images)
{
(result: Bool) in
DispatchQueue.main.async {
//Return our results
returnedResults = result
completionHandler(returnedResults)
}
}
}
这是WebService中的方法:
func deleteLandGradingImages(images: ImagesData, completion: @escaping (_ result: Bool) -> Void)
{
var jsonDict = [AnyHashable: Any]()
//Set Lot
jsonDict["jobNo"] = images.jobNo
//Set Image
jsonDict["imageBytes"] = images.ImageBytes
let jsonData: Data? = try? JSONSerialization.data(withJSONObject: jsonDict, options: .prettyPrinted)
let urlComponents = NSURLComponents(string: webservice + "DeleteGradingImages");
//Assign Username
urlComponents?.user = appDelegate.username;
//Assign Password
urlComponents?.password = appDelegate.password;
//Define our URL String
let url = urlComponents?.url;
//Define URL Request
var request = URLRequest(url: url!)
//Set Header Values for request
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
//Set Header Values for request
request.setValue("application/json", forHTTPHeaderField: "Accept")
//Set Request Method to POST
request.httpMethod = "POST"
//Set Request Body to JSON Data
request.httpBody = jsonData
Alamofire.request(request)
.responseJSON { response in
if(response.error != nil)
{
completion(false)
}
else
{
let responseString = (String(data: response.data!, encoding: .utf8) != nil) as Bool
completion(responseString)
}
}
}
我的循环问题是有时它可以工作,有时我会收到这个错误:
无效更新:第 0 节中的项目数无效。 更新 (1) 后包含在现有部分中的项目必须是 等于该部分中包含的项目数之前 update (1),加上或减去插入或删除的项目数 该部分(0 插入,1 删除)和加或减的数量 移入或移出该部分的项目(0 移入,0 移出)。
有时我会收到此错误:
线程 1:致命错误:索引超出范围
在这条线上
self.array.remove(at: item.item)
我做错了什么?
更新
我从一个答案中得到了这个:
@IBAction func deleteButtonPressed(_ sender: Any) {
let group = DispatchGroup()
let indexPaths = (collectionView?.indexPathsForSelectedItems)!
var deletes = Array<Dictionary<String, Any>>()
for item in indexPaths {
deletes.append(self.array[item.item])
}
for item in deletes {
group.enter()
deleteLandGradingImage(images: ImagesData(jobNo: self.jobNo, ImageBytes: (item["imageBytes"] as! String), Username: appDelegate.username)) { result in
let i = self.array.index { (dic) -> Bool in
return true
}
if i != nil {
self.array.remove(at: i!)
group.leave()
}
}
}
group.notify(queue: .main) {
for item in indexPaths {
let cell = self.collectionView?.cellForItem(at: item) as! ImageCollectionCell
cell.imageView.layer.borderWidth = 0
self.collectionView?.deselectItem(at: item, animated: true)
}
self.navigationItem.rightBarButtonItems = [self.editButton]
self.editButton.isEnabled = true
self.editButton.title = "Edit"
self.doneButton.title = "Done"
self.collectionView?.deleteItems(at: indexPaths)
if(self.array.count == 0)
{
self.imageCollectionDelegate?.ImageCollectionChange(false)
}
}
}
但有时我会在这一行出现错误:
let cell = self.collectionView?.cellForItem(at: item) as! ImageCollectionCell
这是错误:
线程 1:致命错误:打开包装时意外发现 nil 可选值
我注意到这只发生在 iPhone 上,如果我选择图像并滚动 UICollectionView,然后单击删除按钮。
更新
我也试过这个:
@IBAction func deleteButtonPressed(_ sender: Any) {
self.createIndicator()
for item in (collectionView?.indexPathsForSelectedItems)! {
if let cell = self.collectionView?.cellForItem(at: item) as! ImageCollectionCell? {
deleteLandGradingImage(images: ImagesData(jobNo: self.jobNo, ImageBytes: (self.array[item.item]["imageBytes"] as! String), Username: appDelegate.username)) { result in
cell.imageView.layer.borderWidth = 0
self.collectionView?.performBatchUpdates({
self.array.remove(at: item.item)
self.collectionView?.deselectItem(at: item, animated: true)
self.collectionView?.deleteItems(at: [item])
}) { completed in
self.navigationItem.rightBarButtonItems = [self.editButton]
self.editButton.isEnabled = true
self.editButton.title = "Edit"
self.doneButton.title = "Done"
self.stopIndicator()
}
}
}
}
}
但我收到此错误:
线程 1:致命错误:索引超出范围
在这一行:
self.array.remove(at: item.item)
【问题讨论】:
-
评论您的更新:
self.array.remove(at: item.item)正在为您崩溃,所以您能否在执行删除操作之前打印您的数组,并在其下方打印 item.item,您收到错误,因为 item 是您正在尝试删除的不是您的数组中的退出(数组的元素较少)