简体   繁体   中英

Temporarily Hiding a cell in UICollectionView Swift iOS

I've been trying this for hours with no luck. I have a UICollectionView collectionView. The collection view is basically a list with the last cell always being a cell with a big plus sign to add another item. I've enabled reordering with the following. What I'd like for it to do is when I start the interactive movement, the plus sign cell goes away, and then when the user is done editing, it appears again. This is a basic version of the code I have:

func handleLongGesture(gesture: UILongPressGestureRecognizer) {

        switch(gesture.state) {

        case UIGestureRecognizerState.Began:

            ...

            self.collectionView.beginInteractiveMovementForItemAtIndexPath(selectedIndexPath)

            removeAddCell()

        case UIGestureRecognizerState.Changed:


        case UIGestureRecognizerState.Ended:

            ...


            collectionView.endInteractiveMovement()
            replaceAddCell()

        default:

            collectionView.cancelInteractiveMovement()
        }
    }


    func removeAddCell(){

        print("Reloading data - removing add cell")

        data_source.popLast()

        self.collectionView.reloadData()

    }

    func replaceAddCell(){

        print("Reloading data - replacing add cell")

        data_source.append("ADD BUTTON")

        self.collectionView.reloadData()

    }

It's very rough pseudocode, but I can't even get the simplest version of this to work. With the code I have, it gives me the dreaded "Fatal error: unexpectedly found nil while unwrapping an Optional values" on the line where I reference the UICollectionViewCell after removing the items from the data source.

If anyone who has done something like this could share their approach I'd really appreciate it! Thank you!

-Bryce

You can do something like this:

func longPressed(sender: UILongPressGestureRecognizer) {
    let indexPath = NSIndexPath(forItem: items.count - 1, inSection: 0)
    let cell = collectionView.cellForItemAtIndexPath(indexPath) as! YourCollectionViewCell
    switch sender.state {
    case .Began:
        UIView.animateWithDuration(0.3, animations: {
            cell.contentView.alpha = 0
        })

    case .Ended:
        UIView.animateWithDuration(0.3, animations: {
            cell.contentView.alpha = 1
        })

    default: break
    }
}

this way it gradually disappears instead of abruptly.

I've done something like this. The data source for the collection view tracks a BOOL to determine whether or not to show the Add Item Cell. And call insertItemsAtIndexPaths: and deleteItemsAtIndexPaths: to animate the Add Item Cell appearing and disappearing. I actually use a Edit button to toggle the modes. But you can adapt this code to use your gesture recognizer.

basic code:

self.editing = !self.editing; // toggle editing mode, BOOL that collection view data source uses
NSIndexPath *indexPath = [self indexPathForAddItemCell];
if (!self.editing) { // editing mode over, show add item cell
    if (indexPath) {
        [self.collectionView insertItemsAtIndexPaths:@[indexPath]];
    }
}
else { // editing mode started, delete add item cell
    if (indexPath) {
        [self.collectionView deleteItemsAtIndexPaths:@[indexPath]];
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM