1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

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

Simulator Screen Shot - iPhone 11 - 2020-01-02 at 06.31.02.png
###クラス構成について
・ポップオーバーを表示させるクラス
・表示される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)
    }
}
1
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?