我有一个名为 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/