iOS) Cell 꾹 눌러서 미리보기 만들기

1 minute read

Cell 꾹 눌러서 미리보기 만들기 - context menu 만들기

사용방법

UITableViewDelegate 의 메서드를 이용하면 된다.

func tableView(_ tableView: UITableView,
                contextMenuConfigurationForRowAt indexPath: IndexPath,
                point: CGPoint) -> UIContextMenuConfiguration? {
    //code
}

문제

  • previewProvider 파라미터에 그냥 뷰컨을 넣었더니 다음과 같은 오류가 발생했다.

그래서 개발자 문서에서 previewProvider를 찾아보았다.

void 로 들어가서 UIViewController 로 리턴하는 클로저를 넘겨주어야했다.

해결

방법1

  • previewProvider 에 맞는 형태의 함수를 만들어서 뷰컨의 프로퍼티를 지정해준 후 리턴해주었다.
func makeContextMenu() -> UIViewController {
    let storyboard = UIStoryboard(name: "MyTab", bundle: nil)
    guard let vc = storyboard.instantiateViewController(identifier: "MyTabVC") as? MyTabVC else {
        return UIViewController()
    }
    vc.name = name
    vc.profileImage = imageName
    
    return vc
}
  • tableView(_ tableView:contextMenuConfigurationForRowAt indexPath:point:) 메서드에서 UIMenu 를 만들어주었다.
func tableView(_ tableView: UITableView,
                contextMenuConfigurationForRowAt indexPath: IndexPath,
                point: CGPoint) -> UIContextMenuConfiguration? {
    let chat = UIAction(title: "채팅하기") { _ in }
    let voiceTalk = UIAction(title: "보이스톡") { _ in }
    let faceTalk = UIAction(title: "페이스톡") { _ in }
    let gift = UIAction(title: "선물하기") { _ in }
    
    //해당 클래스에 선언해준 변수.
    //makeContextMenu 메서드에서 뷰컨의 프로퍼티를 지정해주기위해서 사용할 것이다.
    self.imageName = friendList[indexPath.row].image
    self.name = friendList[indexPath.row].name
    
    return UIContextMenuConfiguration(identifier: nil, previewProvider: makeContextMenu) { _ in
        UIMenu(title: "", children: [chat, voiceTalk, faceTalk, gift])
    }
}

방법2

  • 위와 같은 코드이다. 하지만 뷰컨을 인스턴스화하는 코드가 tableView(_ tableView:contextMenuConfigurationForRowAt indexPath:point:) 메서드 안에 있다.
  • 달라진 점이라면 뷰컨을 인스턴스화할 때 else 구문에서 UIContextMenuConfiguration() 를 리턴하는 점과 previewProvider 파라미터에 { return vc } 클로저가 들어가는 점이다.
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
    let chat = UIAction(title: "채팅하기") { _ in }
    let voiceTalk = UIAction(title: "보이스톡") { _ in }
    let faceTalk = UIAction(title: "페이스톡") { _ in }
    let gift = UIAction(title: "선물하기") { _ in }
    
    let storyboard = UIStoryboard(name: "MyTab", bundle: nil)
    guard let vc = storyboard.instantiateViewController(identifier: "MyTabVC") as? MyTabVC else {
        return UIContextMenuConfiguration()
    }
    vc.name = friendList[indexPath.row].name
    vc.profileImage = friendList[indexPath.row].image
    
    
    return UIContextMenuConfiguration(identifier: nil, previewProvider: { return vc }) { _ in
        UIMenu(title: "", children: [chat, voiceTalk, faceTalk, gift])
    }
}

출처

apple developer - tableView(_:contextMenuConfigurationForRowAt:point:)

apple developer - adding context menus tutorial

Categories:

Updated: