#ポップオーバーの表示について
今回は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)
}
}