表示したポップオーバー(UIPopoverPresentationController)内のセルを押下したらセルのテキストを引数としてコールバックさせる


ポップオーバーの表示について

今回はUIPopoverPresentationControllerを採用します。
UIPresentationControllerが元々用意されておりましたが、iPhoneで表示出来ないなど
制約があり、リニューアルされたクラスがUIPopoverPresentationControllerです。

なので今回はUIPopoverPresentationControllerを利用してみようと思います。

また、ポップオーバーでTableViewを表示し、その中のString(テキスト)を
コールバックさせる事を目標とします。

クラス構成について

・ポップオーバーを表示させるクラス
・表示されるTableViewクラス

TableViewクラスにクロージャを渡して、
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {時にクロージャを呼び出します。

ポップオーバーを表示させるクラス

objective-c
import UIKit

class LoginViewController: UIViewController,UIPopoverPresentationControllerDelegate {

    ///UserIdを入力するtextField
    @IBOutlet weak var UserIdTextField: UITextField!

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

    ///押下時にポップオーバーを表示させる。
    @IBAction func tappedPopover(_ sender: UIButton) {
        let viewController = TableViewController() //popoverで表示するViewController
        viewController.modalPresentationStyle = .popover
        viewController.preferredContentSize = CGSize(width: 200, height: 44*3)
        let presentationController = viewController.popoverPresentationController
        presentationController?.delegate = self
        presentationController?.permittedArrowDirections = .up
        presentationController?.sourceView = sender
        presentationController?.sourceRect = sender.bounds

        viewController.closure = { (string) in
          print("string")
        }


        present(viewController, animated: true, completion: nil)
    }


    func adaptivePresentationStyle(for controller: UIPresentationController,
                                   traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
    }

}

表示されるTableViewクラス

import UIKit

class TableViewController: UITableViewController {
    //元クラスから受け渡されるクロージャ
    //コールバックしたい時に本クロージャを呼び出す
    var closure: ((String)->Void)? = nil

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

    // MARK: - Table view data source

    override func numberOfSections(in tableView: UITableView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return 3
    }

    //挿入したいデータ(TableViewCell)を1行ずつ生成する
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "Cell")
        if cell == nil {
            cell = UITableViewCell(style: UITableViewCell.CellStyle.default, reuseIdentifier: "Cell")
        }
        cell?.textLabel?.text = "aaa"
        return cell!
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let cell = tableView.cellForRow(at: indexPath)
        let cellString = cell?.textLabel?.text
        closure?(cellString!)
        self.dismiss(animated: false, completion: nil)
    }
}