ios - 从 View 中执行 Segue

标签 ios swift uicollectionview segue

我有一个名为 MenuBar 的自定义类,它是一个 UIView,用于将 UICollectionView 呈现给 View Controller 。我遇到的问题是在选择 UICollectionViewCell 时使用 segue 到另一个 View Controller 。由于 MenuBar 不是 View Controller ,我似乎无法调用 performSegue()。我在我的 Storyboard中使用标识符在两个 View Controller 之间创建了一个 segue。如何从我的自定义 View 类中正确触发 segue?这通常是如何完成的?我尝试创建我的 View Controller 的一个新实例,以便我可以从 didSelectItemAt collectionView 函数中使用 .performSegue() 但我没有不要认为这是正确的做法。示例:

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

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

View Controller :

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)
    }

}

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

最佳答案

这个

let vc = UARTModuleViewController()

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

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)

protocol ColManager { 
   func navigate()
}

weak var delegate:ColManager?

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

关于ios - 从 View 中执行 Segue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53471948/

相关文章:

ios - 获取 UICollectionView 中的行数

android - ios和android沙盒差异

ios - 卸载应用程序后存储数据

仅当从 Xcode 运行时,Swift 包调用/usr/bin/swift 时出现 `Failed to open macho file...Too many levels of symbolic links` 错误

swift - 在watchOS应用程序上输出汉字

ios - 在swift中将 'n'号 Collection View 添加到UIStackView

iphone - 有没有办法找到 UICollectionView 部分的索引?

ios - RestKit postObject 方法中的 post 对象和它返回的 RKMappingResult 是什么关系?

ios - 在 iOS8 中更改键盘中完成按钮的文本

ios - 如何修复 Firebase SIGABRT 崩溃 iOS