UICollectionView功能问题

时间:2015-12-04 17:35:21

标签: ios swift uibutton uicollectionview uicollectionviewcell

我在VC1上有一个UICollectionViewCell,单元格包含一个图像,一个标签和3个按钮。

当我点击单元格时。这会触发我didSelectItemAtIndexPath将我带到编辑项目屏幕。

如何访问每个按钮并将其与我点击的单元格相关联?

因此,如果我添加了6个单元格,并且我单击单元格1,按钮1,它会将我带到一个包含该人信息的生物页面。如果我点击单元格2按钮1,它会带我到相同的生物VC,但与我点击的单元格有不同的信息。

我的困惑在于在何处或如何设置它?

谢谢!

    import UIKit
    import Parse


    class TrainersViewController: UIViewController,         UICollectionViewDataSource, UICollectionViewDelegate, AddNewTrainerViewControllerDelegate {

var trainers: [TrainerArray]


required init?(coder aDecoder: NSCoder) {
    trainers = [TrainerArray]()
    super.init(coder: aDecoder)
    loadTrainerItems()
}

//connection to the collection view
@IBOutlet weak var collectionView: UICollectionView!


func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
   print("selected")
   saveTrainerItems()

}

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return trainers.count
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("TrainerCell", forIndexPath: indexPath)
    var buttonOne = cell.viewWithTag(10)
    buttonOne = indexPath.row



    let trainer = trainers[indexPath.row]
    configureTrainerForCell(cell, withTrainerArray: trainer)
    return cell
}


func configureTrainerForCell(cell: UICollectionViewCell, withTrainerArray trainer: TrainerArray) {

    if trainer.trainerImage == nil {

        let label = cell.viewWithTag(1000) as! UILabel
        trainer.trainerImage = UIImage(named: "defaultImage")
        label.text = trainer.name

    } else {
    let image = cell.viewWithTag(2000) as! UIImageView
    image.image = trainer.trainerImage

    let label = cell.viewWithTag(1000) as! UILabel
    label.text = trainer.name
}
}


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


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

//This method adds a new trainer to the trainer array
func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishAddingItem item: TrainerArray) {

    let newRowIndex = trainers.count
    trainers.append(item)

    let indexPath = NSIndexPath(forRow: newRowIndex, inSection: 0)
    let indexPaths = [indexPath]
    collectionView.insertItemsAtIndexPaths(indexPaths)

    dismissViewControllerAnimated(true, completion: nil)
    saveTrainerItems()

}

func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishDeletingItem item: TrainerArray) {

    if let index = trainers.indexOf(item) {

        let indexPath = NSIndexPath(forRow: index, inSection: 0)
        let indexPaths = [indexPath]
        if let _ = collectionView.cellForItemAtIndexPath(indexPath) {

            self.trainers.removeAtIndex(index)
            self.collectionView.deleteItemsAtIndexPaths(indexPaths)

        }
    }
        dismissViewControllerAnimated(true, completion: nil)
        saveTrainerItems()
}

//This Method Edits a Trainer
func addNewTrainerViewController(controller: AddNewTrainerViewController, didFinishEditingItem trainer: TrainerArray) {

    if let index = trainers.indexOf(trainer) {

        let indexPath = NSIndexPath(forRow: index, inSection: 0)
        if let cell = collectionView.cellForItemAtIndexPath(indexPath){

            configureTrainerForCell(cell, withTrainerArray: trainer)
        }
    }
    saveTrainerItems()
    dismissViewControllerAnimated(true, completion: nil)
}


func addNewTrainerViewControllerDidCancel(controller: AddNewTrainerViewController) {
    dismissViewControllerAnimated(true, completion: nil)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "AddTrainer" {

        let navigationController = segue.destinationViewController as! UINavigationController
        let controller = navigationController.topViewController as! AddNewTrainerViewController
        controller.delegate = self

    } else if segue.identifier == "EditTrainer" {

        let navigationController = segue.destinationViewController as! UINavigationController
        let controller = navigationController.topViewController as! AddNewTrainerViewController
        controller.delegate = self

        if let indexPath = collectionView.indexPathForCell(sender as! UICollectionViewCell) {

            controller.trainerToEdit = trainers[indexPath.row]
        }
    }
}



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

func documentsDirectory() -> String {

    let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
    return paths[0]
}


func dataFilePath() -> String {

    return (documentsDirectory() as NSString)
                            .stringByAppendingPathComponent("Trainers.plist")
}

func saveTrainerItems() {

    let data = NSMutableData()
    let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
    archiver.encodeObject(trainers, forKey: "TrainersArray")
    archiver.finishEncoding()
    data.writeToFile(dataFilePath(), atomically: true)
}

func loadTrainerItems() {

    let path = dataFilePath()
    if NSFileManager.defaultManager().fileExistsAtPath(path) {

        if let data = NSData(contentsOfFile: path) {

            let unarchiver = NSKeyedUnarchiver(forReadingWithData: data)
            trainers = unarchiver.decodeObjectForKey("TrainersArray") as! [TrainerArray]
            unarchiver.finishDecoding()
        }
    }
}


@IBAction func logOut(sender: AnyObject) {

        let alert = UIAlertController(title: "Are You Sure You Want To Log Out?", message: "Please Enter Your Username", preferredStyle: UIAlertControllerStyle.Alert)

        alert.addTextFieldWithConfigurationHandler { (textField) -> Void in
        }

    alert.addAction(UIAlertAction(title: "Log Out", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        let textF = alert.textFields![0] as UITextField

        if textF.text! != PFUser.currentUser()?.username {
            self.displayGenericAlert("Incorrect Username!", message: "Please Enter a Valid Username")

        } else if textF.text! == PFUser.currentUser()?.username {
           PFUser.logOut()
           _ = PFUser.currentUser()
        self.dismissViewControllerAnimated(true, completion: nil)
        }
    }))

    alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Default, handler: { (action) -> Void in
        if action == true {
        self.dismissViewControllerAnimated(false, completion: nil)
        }}))

self.presentViewController(alert, animated: true, completion: nil)

}

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

    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: "Ok", style: .Default, handler: { (action) -> Void in
    }))
    self.presentViewController(alert, animated: true, completion: nil)
}

@IBAction func bioSegueButton(sender: AnyObject) {

}

}

2 个答案:

答案 0 :(得分:0)

您可以从索引'indexpath.row'获取数组中的数据。

答案 1 :(得分:0)

您可以在按钮上添加一个标签,该标签与其所在单元格的索引相对应。在cellForItemAtIndexPath中,您可以添加类似......

的内容。
button.tag = indexPath.row

在按钮的选择器中,您可以访问它......

func buttonSelector(sender: UIButton) {
    let index = sender.tag
    let trainer = trainers[index]
}

编辑:

您可能在cellForRowAtIndexPath中执行的更完整版本:

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("TrainerCell", forIndexPath: indexPath) as? MyCollectionViewCell
    var buttonOne = cell?.button1
    buttonOne?.tag = indexPath.row

    let trainer = trainers[indexPath.row]
    configureTrainerForCell(cell, withTrainerArray: trainer)
    return cell!
}

您的收藏品查看单元格类:

class MyCollectionViewCell: UICollectionViewCell {
    @IBOutlet weak var button1: UIButton! // connect this to the button in your interface builder's collection view cell.

    // Do the same for any other subviews.
}

同样在界面构建器中,将集合视图单元原型的类更改为此新的自定义类。