ios - 从视图中执行 Segue
问题描述
我有一个名为的自定义类MenuBar
,UIView
用于将 a 呈现UICollectionView
给视图控制器。我遇到的问题是在UICollectionViewCell
选择 a 时使用 segue 到另一个视图控制器。由于MenuBar
不是视图控制器,我似乎无法调用performSegue()
. 我在我的故事板中创建了一个带有标识符的两个视图控制器之间的 segue。如何从我的自定义视图类中正确触发 segue?这通常会怎么做?我尝试创建我的视图控制器的新实例,以便我可以.performSegue()
在didSelectItemAt
collectionView
函数中使用,但我认为这根本不是正确的方法。例子:
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
}
}
菜单栏.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 不是以编程方式创建的,则可能会导致崩溃,而您需要一个委托
lazy var menuBar: MenuBar = {
let mb = MenuBar()
mb.delegate = self
return mb
}()
并在里面添加这个 varMenuBar
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
方法
推荐阅读
- c# - 使用c#将灰度图像转换为rgb图像
- unity3d - 如何在 Unity 运行时制作 AssetBundle?
- debian - 为什么我的 debian/config 脚本在安装过程中没有被调用?
- python - Pandas 使用 apply 函数更新多个列
- solr - solr 在核心中加入多值字段查询
- android - JS:错误 javax.net.ssl.SSLHandshakeException:java.security.cert.CertPathValidatorException:找不到证书路径的信任锚
- sql - 如何仅选择那些在 TSQL 中具有不同字符串的行?
- uml - 理性玫瑰评论区
- python - 制作 xmls 的修改副本并将它们放在相应的文件夹中?
- python - Python 2.7.1 - 如何记录方法参数类型?