我一整天都被困在这个问题上。
我已经正确设置了我的代表团。我有 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. 中删除按钮所在的代码。
最佳答案
在委托(delegate)中添加用于删除的协议(protocol)方法:
func addNewTrainerViewControllerDidCHooseDelete(controller: AddNewTrainerViewController)
在您的
deleteButton()
中在VC2上实现对上面委托(delegate)方法的调用。- 在VC1中,实现上面的委托(delegate)方法,按照
func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishEditingItem trainer: TrainerArray)
中的实现方式找到正确的单元格。 。然后删除单元格并以与编辑 Trainer 相同的方式关闭 VC2。
关于ios - 为collectionView添加deleteItemAtIndexPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33884821/