ios - 为collectionView添加deleteItemAtIndexPath

标签 ios swift uicollectionview uicollectionviewcell

我一整天都被困在这个问题上。

我已经正确设置了我的代表团。我有 VC 1,我可以单击右上角的栏按钮项来打开 VC 2。

在 VC 中,我能够添加一个人的姓名和照片,并将信息发送回 VC 1,其中对象被放置到 CollectionView 单元格的数组中。

然后,我设置了 DidSelectItemAtIndexPath 方法,以便当我单击 collectionViewCell 时。它会转到相同的“+”屏幕(VC 2)

仅这一次,它将标题更改为“删除人员”,并以编程方式将“垃圾箱”按钮添加到左侧的导航栏。

当我单击“垃圾箱”按钮时,它会打印到日志“已删除人员”。 问题就在这里

如果我能够添加和编辑一个人的图像和名称并将其永久保存,我的协议(protocol)和代表显然是正确的。

我一生都无法弄清楚如何将deleteItemAtIndexPath 函数添加到我添加的垃圾按钮中。

这是针对 Swift 的,如果有人能给我我所缺少的东西,我将非常感激。一切正常,但我不知道如何构造垃圾按钮,以便它删除所选项目。

谢谢!

import UIKit

protocol AddNewTrainerViewControllerDelegate: class 
{
     func addNewTrainerViewControllerDidCancel(controller: AddNewTrainerViewController)
     func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishAddingItem item: TrainerArray)
     func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject])
     func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishEditingItem trainer: TrainerArray)
}

class AddNewTrainerViewController: UITableViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

@IBAction func openPhotoLibrary(sender: AnyObject) {

    var photoPicker = UIImagePickerController()
    photoPicker.delegate = self
    photoPicker.sourceType = .PhotoLibrary
    photoPicker.allowsEditing = true 
    self.presentViewController(photoPicker, animated: true, completion: nil)
}

@IBOutlet weak var trainerPhoto: UIImageView!

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    trainerPhoto.image = info[UIImagePickerControllerOriginalImage] as? UIImage
    self.dismissViewControllerAnimated(false, completion: nil)

}

override func viewDidLoad() {
    super.viewDidLoad()

    if let trainer = trainerToEdit {

        title = "Edit Trainer"
        textField.text = trainer.name
        trainerPhoto.image = trainer.trainerImage
        doneBarButton.enabled = true

        let deleteButton = UIBarButtonItem(barButtonSystemItem: .Trash, target: self, action: "deleteButton")
        navigationItem.leftBarButtonItem = deleteButton
    }
}

func deleteButton() {
    print("Trainer Deleted")
    dismissViewControllerAnimated(true, completion: nil)
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    textField.becomeFirstResponder()
}

//outlet for done bar button item to control status
@IBOutlet weak var doneBarButton: UIBarButtonItem!

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    let oldText: NSString = textField.text!
    let newText: NSString = oldText.stringByReplacingCharactersInRange(range, withString: string)
    if newText.length > 3 {
        doneBarButton.enabled = true
    } else {
        doneBarButton.enabled = false
    }

   return true
}

//Trainer Name Text Field
@IBOutlet weak var textField: UITextField!

//action outlet for done button
@IBAction func doneButton(sender: UIBarButtonItem) {

    if let trainer = trainerToEdit {

        trainer.name = textField.text!
        trainer.trainerImage = trainerPhoto.image!
        delegate?.addNewTrainerViewController(self, didFinishEditingItem: trainer)

    } else if trainerPhoto.image == nil {
        displayAlert("Please Add Your Trainer's Photo", message: "")

    } else if trainerPhoto.image != nil {

    let item = TrainerArray()
    item.name = textField.text!
    item.trainerImage = trainerPhoto.image!
    delegate?.addNewTrainerViewController(self, didFinishAddingItem: item)

    }

}

//action outlet for cancel or back button
@IBAction func cancelButton(sender: UIBarButtonItem) {

    delegate?.addNewTrainerViewControllerDidCancel(self)
}

// doesn't allow selection of the row. Won't turn gray.
override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {

    return nil
}

weak var delegate: AddNewTrainerViewControllerDelegate?

func displayAlert (title: String, message: String) {

    var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.Default, handler: nil))
    self.presentViewController(alert, animated: true, completion: nil)


}

var trainerToEdit: TrainerArray?
}

这是 VC 2. 中删除按钮所在的代码。

最佳答案

  1. 在委托(delegate)中添加用于删除的协议(protocol)方法:

    func addNewTrainerViewControllerDidCHooseDelete(controller: AddNewTrainerViewController)
    
  2. 在您的 deleteButton() 中在VC2上实现对上面委托(delegate)方法的调用。

  3. 在VC1中,实现上面的委托(delegate)方法,按照func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishEditingItem trainer: TrainerArray) 中的实现方式找到正确的单元格。 。然后删除单元格并以与编辑 Trainer 相同的方式关闭 VC2。

关于ios - 为collectionView添加deleteItemAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884821/

相关文章:

ios - 使用 didSelectItemAtIndexPath 时是否可以访问不等于索引路径的所有单元格?

ios - 启用双倍长度伪语言在 Xcode 7.3 中不起作用

ios - Quickblox IOS sdk 是否支持以下所有选项?

iphone - uisegmentedcontrol 手动设置 selectedindex 不工作

swift - Swift 中的尾随闭包语法是什么?

arrays - 从解码的 Firebase 数据中创建一个数组

swift - Swift 是动态语言还是静态语言?

ios - iphone 5 - 在屏幕上居中 UIImagePickerController

ios - 如何删除 UICollectionViewCell 中的间距?

ios - UICollectionView 单元可重用性问题 - swift