将 Tableview Cell 设为允许弹出的按钮 window

Make Tableview Cell into a button to allow popup window

我正在尝试为表格视图单元格创建一个弹出窗口 window。我想要它,以便在按下任何 "cells" 时,屏幕上会显示一个弹出窗口 window。我似乎无法弄清楚如何将每个单元格变成一个按钮,该按钮会调用 window 来启动。

Table 查看方式

import UIKit

class ContactsViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

private let contacts = ContactAPI.getContacts() // model
let contactsTableView = UITableView() // view

var success = true

lazy var popUpWindow: PopUpWindow = {
    let view = PopUpWindow()
    view.translatesAutoresizingMaskIntoConstraints = false
    view.layer.cornerRadius = 5
    view.delegate = self as! PopUpDelegate
    return view
}()

let visualEffectView: UIVisualEffectView = {
    let blurEffect = UIBlurEffect(style: .light)
    let view = UIVisualEffectView(effect: blurEffect)
    view.translatesAutoresizingMaskIntoConstraints = false
    return view
}()

let button: UIButton = {

    let button = UIButton(type: .system)
    button.backgroundColor = .white
    button.setTitle("one", for: .normal)
    button.setTitleColor(UIColor.blue, for: .normal)
    button.addTarget(self, action: #selector(handleShowPopUp), for: .touchUpInside)
    button.translatesAutoresizingMaskIntoConstraints = false
    button.layer.cornerRadius = 5
    return button
}()

override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    view.backgroundColor = .white

    view.addSubview(contactsTableView)

    contactsTableView.translatesAutoresizingMaskIntoConstraints = false

    contactsTableView.topAnchor.constraint(equalTo:view.safeAreaLayoutGuide.topAnchor).isActive = true
    contactsTableView.leftAnchor.constraint(equalTo:view.safeAreaLayoutGuide.leftAnchor).isActive = true
    contactsTableView.rightAnchor.constraint(equalTo:view.safeAreaLayoutGuide.rightAnchor).isActive = true
    contactsTableView.bottomAnchor.constraint(equalTo:view.safeAreaLayoutGuide.bottomAnchor).isActive = true

    contactsTableView.dataSource = self
    contactsTableView.delegate = self

    contactsTableView.register(ContactTableViewCell.self, forCellReuseIdentifier: "contactCell")

    navigationItem.title = "Contacts"
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return contacts.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactTableViewCell

    cell.contact = contacts[indexPath.row]

    view.addSubview(button)
    button.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
    button.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    button.heightAnchor.constraint(equalToConstant: 50).isActive = true
    button.widthAnchor.constraint(equalToConstant: view.frame.width - 32).isActive = true

    view.addSubview(visualEffectView)
    visualEffectView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    visualEffectView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
    visualEffectView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    visualEffectView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true

    visualEffectView.alpha = 0

    return cell
}

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {


}

func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 100
}


// MARK: - Selectors

@objc func handleShowPopUp() {
    view.addSubview(popUpWindow)
    popUpWindow.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -40).isActive = true
    popUpWindow.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    popUpWindow.heightAnchor.constraint(equalToConstant: view.frame.width - 64).isActive = true
    popUpWindow.widthAnchor.constraint(equalToConstant: view.frame.width - 64).isActive = true

    popUpWindow.showSuccessMessage = success
    success = !success

    popUpWindow.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    popUpWindow.alpha = 0

    UIView.animate(withDuration: 0.5) {
        self.visualEffectView.alpha = 1
        self.popUpWindow.alpha = 1
        self.popUpWindow.transform = CGAffineTransform.identity
    }
}

}

弹出委托

extension ContactsViewController: PopUpDelegate {

func handleDismissal() {
    UIView.animate(withDuration: 0.5, animations: {
        self.visualEffectView.alpha = 0
        self.popUpWindow.alpha = 0
        self.popUpWindow.transform = CGAffineTransform(scaleX: 1.3, y: 1.3)
    }) { (_) in
        self.popUpWindow.removeFromSuperview()
        print("Did remove pop up window..")
    }
}

}

UITableViewDelegatedidSelectRowAt 方法用于此。您可以在那里调用 handleShowPopUp 方法。您有什么理由不想使用它吗?