Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue

Posted

技术标签:

【中文标题】Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue【英文标题】:Swift 4 - How to activate segue programmatically from button nested in UICollectionViewCell 【发布时间】:2018-01-15 01:46:06 【问题描述】:

我正在尝试激活 UICollectionView、UIViewController 的子视图和单独的 ViewController(称为 RegisterController)之间的 segue。 CollectionView 都是以编程方式设置的,最后一个单元格上有一个按钮。但是,我不能执行典型的performSegue(_:withIdentfier),因为该按钮位于 CollectionView 中。所以,我在 ViewController 中设置了一个方法,将 CollectionView 保存到performSegue(_:withIdentifier)。我在 CollectionViewController 中设置了一个实例来调用方法:

lazy var registerButton: UIButton = 
    let btn = UIButton(type: .system)
    btn.setTitle("Don't have an account?", for: .normal)
    btn.setTitleColor(lighterOrange, for: .normal)
    btn.addTarget(self, action: #selector(registerScreenAppear), for: .touchUpInside)
    return btn
()

@objc func registerScreenAppear()
    let vc: ViewController = ViewController()
    _ = vc.toRegister()

ViewController中的方法是

func toRegister()
    performSegue(withIdentifier: "toRegister", sender: self)

我正在获取调用堆栈: NSInvalidArgumentException', reason: 'Receiver (<audible.ViewController: 0x7fe780724770>) has no segue with identifier 'toRegister''

我知道我可能做错了什么,但我已经搜索和搜索,但找不到解决方案。任何帮助表示赞赏,谢谢

(是的,我已经配置了 segue 并在故事板中给了它一个标识符,但是我必须通过代码执行此操作的原因是因为 CollectionView 和按钮是以编程方式创建的,所以我不能使用 Interface Builder )

【问题讨论】:

在Storyboard中,按住键控,从ViewController拖一条线到RegisterController,创建一个名为“toRegister”的segue。 @YunCHEN 我已经做到了 您正在创建视图控制器的新实例,而不是引用现有实例。这个新实例没有链接到情节提要,因为您使用了一个简单的初始化程序来创建它。您需要使用委托或闭包。有关如何将单元格中的事件返回到视图控制器的一些想法,请参阅***.com/questions/28659845/… 【参考方案1】:

在 registerScreenAppear 方法中调用performSegue 或调用self.toRegister()like

@objc func registerScreenAppear()
    self.toRegister()

 @objc func registerScreenAppear()
    performSegue(withIdentifier: "toRegister", sender: self)
 

注意:使用后面的一个,因为它会删除额外的函数调用,即 toRegister()。

【讨论】:

由于 registerScreenAppear 方法在 UICollectionViewCell 类中,perfromSegue(_:withIdentifier) 将给出“未解决的标识符使用”错误。 好的,你的问题,你可以移动 addTarget 行:“ btn.addTarget(self, action: #selector(registerScreenAppear), for: .touchUpInside) ”来查看控制器并在cellForItem方法中添加它在配置单元格时。并将相应的目标方法移动到视图控制器。

以上是关于Swift 4 - 如何从嵌套在 UICollectionViewCell 中的按钮以编程方式激活 segue的主要内容,如果未能解决你的问题,请参考以下文章

如何在 swift 4.1 和 xcode 9.3 中使用 JSONDecoder 解码嵌套的 JSON 数组和对象?

如何通过在 swift 中实现观察者从 Firebase 实时数据库中获取嵌套数据

使用可选值 Swift 4 解码嵌套 JSON

在 SWIFT 4 中解析嵌套的 JSON

如何使用viewForSupplementaryElementOfKind - swift显示UICollectionView的特定单元格

Swift 4 - 使用 PromiseKit 调用嵌套