【问题标题】:Performing Segue from within a View从视图中执行 Segue
【发布时间】:2018-11-25 21:02:05
【问题描述】:

我有一个名为MenuBar 的自定义类,它是一个UIView,用于将UICollectionView 呈现给视图控制器。我遇到的问题是在选择UICollectionViewCell 时使用对另一个视图控制器的segue。由于MenuBar 不是视图控制器,我似乎无法调用performSegue()。我在我的故事板中创建了一个带有标识符的两个视图控制器之间的 segue。如何从我的自定义视图类中正确触发 segue?这通常会怎么做?我尝试创建我的视图控制器的新实例,以便我可以在 didSelectItemAt collectionView 函数中使用 .performSegue(),但我认为这根本不是正确的方法。示例:

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    let vc = UARTModuleViewController()
    vc.performSegue(withIdentifier: "colorSelection", sender: nil)
}

任何关于如何在此函数中执行 segue 的建议将不胜感激。下面我将提供我现有代码的关键组件,以便您可以看到我在做什么。这两个类中都有更多代码,但我认为这对于我想要完成的总体概念来说应该足够了。

视图控制器:

class UARTModuleViewController: UIViewController, CBPeripheralManagerDelegate {
    override func viewDidLoad() {
        setupMenuBar()
    }

    let menuBar: MenuBar = {
        let mb = MenuBar()
        return mb
    }()

    private func setupMenuBar() {
        view.addSubview(menuBar)

        menuBar.translatesAutoresizingMaskIntoConstraints = false
        menuBar.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        menuBar.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        menuBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        menuBar.heightAnchor.constraint(equalToConstant: 80).isActive = true
    }
}

MenuBar.swift:

class MenuBar : UIView, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    lazy var collectionView : UICollectionView = {
        let layout = UICollectionViewFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = UIColor.clear
        cv.dataSource = self
        cv.delegate = self
        return cv
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupCollectionView()
    }

    private func setupCollectionView() {
        self.addSubview(collectionView)
        collectionView.register(MenuCell.self, forCellWithReuseIdentifier: "MenuCell")

        collectionView.translatesAutoresizingMaskIntoConstraints = false
        collectionView.topAnchor.constraint(equalTo: topAnchor).isActive = true
        collectionView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        collectionView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
        collectionView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let vc = UARTModuleViewController() // I want to perform a segue from here
        vc.performSegue(withIdentifier: "colorSelection", sender: nil)
    }

}

提前感谢任何可以提供有用意见和建议的人!

【问题讨论】:

    标签: ios swift uicollectionview segue


    【解决方案1】:

    这个

    let vc = UARTModuleViewController()
    

    动态创建另一个对象,该对象独立于呈现的对象,如果 vc 不是以编程方式创建的,则可能会导致崩溃,而您需要一个委托

    lazy var menuBar: MenuBar = {
        let mb = MenuBar()
        mb.delegate = self
        return mb
    }()
    

    并在MenuBar 中添加这个变量

    weak var delegate:UARTModuleViewController?
    

    那就这样用吧

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 
        delegate?.performSegue(withIdentifier: "colorSelection", sender: nil)
    }
    

    应该说更好的可重用方法是创建一个协议

    protocol ColManager { 
       func navigate()
    }
    

    weak var delegate:ColManager?
    

    并且任何想使用的类都应该符合协议并实现navigate方法

    【讨论】:

    • 这对我来说更有意义。但是,当我现在在进行建议的更改后调用 mb.delegate = self 时,我在同一行收到此错误 Cannot assign value of type '(UARTModuleViewController) -> () -> (UARTModuleViewController)' to type 'UARTModuleViewController? '
    • 成功了lazy var menuBar: MenuBar ?
    • 啊,我错过了那个编辑。这很完美!感谢您的帮助!使用weak var delegate:UARTModuleViewController? 并将其分配给self 会更有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2012-06-02
    • 1970-01-01
    相关资源
    最近更新 更多