iOS/UIKIT

컬렉션 뷰의 아이템을 길게 눌렀을 때, 호출되는 메서드 사용하기

밤새는 탐험가89 2024. 7. 11. 05:06

 

 

구현 내용 

  • 컬렉션 뷰의 아이템을 길게 누르면 "Download" 라는 글과 함께 메서드가 호출된다. 

 

구현 코드

  • 해당 컬렉션 뷰의 아이템들은 Home 뷰에 있는 테이블에 등록된 것이다. 
  • 해당 컬렉션 뷰 셀이 있는 파일 내에 아래 코드를 추가한다. 
import UIKit

class CollectionViewTableViewCell: UITableViewCell {
    
    ...
    
    private func downloadTitleAt(indexPath: IndexPath) {
        
        DatePersistenceManager.shared.downloadTitleWith(model: titles[indexPath.row]) { result in
            switch result {
            case .success():
                NotificationCenter.default.post(name: NSNotification.Name("downloaded"), object: nil)
            case .failure(let error):
                print(error.localizedDescription)
            }
        }
    }
}

extension CollectionViewTableViewCell: UICollectionViewDelegate, UICollectionViewDataSource {
    
    ...
    
    func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], point: CGPoint) -> UIContextMenuConfiguration? {
        
        let config = UIContextMenuConfiguration(
            identifier: nil,
            previewProvider: nil) { _ in
                let downloadAction = UIAction(
                    title: "Download",
                    image: nil,
                    identifier: nil,
                    discoverabilityTitle: nil,
                    state: .off) { _ in
                        self.downloadTitleAt(indexPath: indexPaths.first!)
                    }
                return UIMenu(title: "", image: nil, identifier: nil, options: .displayInline, children: [downloadAction])
            }
        return config
    }
}

 

 

func collectionView(_ collectionView: UICollectionView, contextMenuConfigurationForItemsAt indexPaths: [IndexPath], point: CGPoint) -> UIContextMenuConfiguration?

 

  • 이 메서드는 컬렉션 뷰의 아이템에 대한 컨텍스트 메뉴 구성을 요청받을 때 호출된다.

 

let config = UIContextMenuConfiguration(
    identifier: nil,
    previewProvider: nil) { _ in
    // 메뉴 아이템 구성
}

 

  • 이 부분에서 컨텍스트 메뉴의 기본 구성을 생성한다.

 

let downloadAction = UIAction(
    title: "Download",
    image: nil,
    identifier: nil,
    discoverabilityTitle: nil,
    state: .off) { _ in
        self.downloadTitleAt(indexPath: indexPaths.first!)
    }

 

  • "Download"라는 제목의 액션을 생성한다. 이 액션이 선택되면 downloadTitleAt 메서드가 호출된다.

 

return UIMenu(title: "", image: nil, identifier: nil, options: .displayInline, children: [downloadAction])

 

  • downloadAction을 포함하는 UIMenu를 생성한다. .displayInline 옵션은 메뉴 아이템을 인라인으로 표시한다.

 

return config

 

  • 생성된 컨텍스트 메뉴 구성을 반환한다.