UIBarButtonItem 中的选择器未调用

Selector in UIBarButtonItem not calling

我的 UIBarButton 上有一个选择器引用了一个函数来连接到另一个视图控制器,但是单击时该函数永远不会被调用。通过测试断点,我可以看到函数 segueToCartViewController 永远不会被调用。 提前致谢!

UIBarButtonItem 初始化

private let reuseIdentifier = "ItemCell"
private let SegueCartIdentifier = "CatalogToCart"

final class CatalogViewController: UICollectionViewController {
    //MARK: -properties

    var brand: Brand!
    var cart: [Item]!

    fileprivate let itemsPerRow:CGFloat = 3
    fileprivate let sectionInsets = UIEdgeInsets(top: 30, left: 20, bottom: 30, right: 20)
    private var cartItem: UIBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "Cart"), style: .plain, target: self, action: #selector(segueToCartViewController(_:)))

    var selectedItemIndexPath: IndexPath?{
        didSet{
            var indexPaths = [IndexPath]()
            if let selectedItemIndexPath = selectedItemIndexPath{
                indexPaths.append(selectedItemIndexPath)
            }
            if let oldValue = oldValue{
                indexPaths.append(oldValue)
            }

            collectionView?.performBatchUpdates({
                self.collectionView?.reloadItems(at: indexPaths)
            }) { completed in
                if let selectedItemIndexPath = self.selectedItemIndexPath{
                    self.collectionView?.scrollToItem(at: selectedItemIndexPath, at: .centeredVertically, animated: true)
                }
            }
        }
    }

    override func viewDidAppear(_ animated: Bool) {
        self.navigationController?.setToolbarHidden(false, animated: false)
        let flex = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        self.navigationController?.toolbar.items = [flex,cartItem,flex]
    }
}

呼吁转场

//MARK: CartNavigation
extension CatalogViewController: CartDelegate{

    func segueToCartViewController(_ sender: AnyObject){
        super.performSegue(withIdentifier: SegueCartIdentifier, sender: sender)
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let destination = segue.destination as? UINavigationController else{
            return
        }

        cartVC.delegate = self
    }

    func closeModallyPresentedViewController() {
        dismiss(animated: true, completion: nil)
    }
}

您的 UIBarButtonItem 的目标是 nil,因为 self 在它初始化期间是 nil。

你可以这样初始化它

final class CatalogViewController: UICollectionViewController {
    lazy final private var cartItem: UIBarButtonItem = { [unowned self] in
        return UIBarButtonItem(image: #imageLiteral(resourceName: <#T##String#>), style: .plain, target: self, action: #selector(segueToCartViewController(_:)))
    }()

    override function viewDidAppear(_ animated: Bool) {
        //blah blah, the rest of your code
    }
}

See here 以获得有关属性初始化期间 self 值的良好解释。