UIBarButtonItem 中的自定义选择器(带有额外参数)

Custom selector (with extra params) in UIBarButtonItem

如何在 UIBarButtonItem 中定义带有额外参数的动作?

我需要将 CNContactViewController 对象传递给 buttonActionMethod:

class ContactHelper { 

    public static func showContact(controller: UIViewController, contactViewControllerDelegate: CNContactViewControllerDelegate,

                                   contact: CNContact) {

        let contactController = CNContactViewController.init(for: contact)

        contactController.navigationItem.leftBarButtonItem =

            UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.cancel, target: self,

                          action: #selector(ContactHelper.buttonAction))

        contactController.delegate = contactViewControllerDelegate

        let navigationController = UINavigationController(rootViewController: contactController)

        controller.present(navigationController, animated: false)

    }

    private static func buttonAction(sender: ContactButton) {
        // need to pass contactController from showContact function
        contactController.dismiss(animated: true, completion: nil)

    }

}

您不能修改操作方法的签名。给定的 API 强制执行一组特定的允许参数。在这种情况下,唯一允许的参数是按钮。

正确的解决方案是重构您的 ContactHelper class 以使用实例方法和实例属性来存储状态,而不是将所有内容设为静态。

另一个(可能更好的)解决方案是扩展 CNContactViewController 以添加附加功能而不是创建此助手 class。