Swift:按下collectionView项目时推送新视图

Posted

技术标签:

【中文标题】Swift:按下collectionView项目时推送新视图【英文标题】:Swift: Push new View when collectionView item is pressed 【发布时间】:2020-04-10 18:35:29 【问题描述】:

我目前正在实现一个带有水平 collectionView 和顶部导航栏的应用程序。水平视图是在激活页面模式的情况下实现的,因此用户可以在 4 个选项卡之间进行选择。每个水平 collectionView 中都有垂直 collectionView,因此用户也可以垂直滚动。

现在我想与用户交互,当他按下垂直 collectionView 项目之一时。当他按下一个项目时,应该会出现一个新视图,而不会越过顶部的导航栏。所以基本上垂直集合视图应该替换为不同的视图。

我面临的问题是,我不知道如何通知控制器某个项目被按下。我知道我可以在调用didSelectItemAt 时获取所选项目,但我该如何实现,我的控制器知道该项目已被按下,现在还必须加载一个关于 MVC 模型的新视图。

我面临的另一个问题是,我不知道如何推送一个不会越过导航栏的新控制器。对于这个问题,我在此链接下找到了答案:Swift 4 - Push a ViewController from a UICollectionView Cell 但不幸的是,这对我不起作用。

【问题讨论】:

【参考方案1】:

免责声明:显然我的示例非常简化,因为您没有发布任何代码。请考虑下次这样做,因为如果您这样做,其他人可以更好地帮助您。


首先你必须创建一个从第一个到第二个 ViewController 的 Segue。您可以通过使用鼠标右键从 (1) 拖动到 (2) 来执行此操作(为了测试,我使用了 UITableView,但整个过程应该使用 CollectionView 相同)。

然后从上下文菜单中选择Show

现在你应该有一个箭头,从第一个 ViewController 指向第二个 ViewController。选择它并在右侧的属性检查器中为其指定一个唯一标识符。

现在您可以进入第一个 ViewController 的代码并将以下代码添加到 didSelectItemAt 函数(显然将 <YOUR IDENTIFIER> 替换为您之前提供给 segue 的实际标识符)。

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) 
    self.performSegue(withIdentifier: "<YOUR IDENTIFIER>", sender: collectionView.cellForItem(at: indexPath))
    collectionView.deselectItem(at: indexPath, animated: true)

现在,如果您选择一个单元格,您将转到第二个 ViewController,但 NavigationController 保持不变。您甚至可以免费获得一个后退按钮。

如果你需要给第二个 ViewController 一些关于哪个 Cell 被按下的信息,你必须做更多的事情。

假设,您需要所选单元格的 IndexPath,并且您的第二个 ViewController 的 ViewController 文件如下所示:

import UIKit

class ViewController2: ViewController 

    @IBOutlet weak var label: UILabel!

    var indexPath: IndexPath!

    override func viewDidLoad() 
        super.viewDidLoad()

        label.text = "\(self.indexPath.row)"
    

现在您需要一种将 IndexPath 提供给第二个 ViewController 的方法。 你可以这样做,使用prepare(for:sender:) 函数,如下所示:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    if segue.identifier == "<YOUR IDENTIFIER>", let dest = segue.destination as? ViewController2, let cell = sender as? UICollectionViewCell 
        dest.indexPath = self.collectionView.indexPath(for: cell)!
    

【讨论】:

感谢您的回答!将来我会发布一些代码。在我的示例中,我没有使用 Storyboard。你知道我如何在没有情节提要的情况下执行你的代码吗?例如如何设置视图的 segue 标识符? 我想我在这里找到了答案:***.com/questions/41767655/… @Benipro98 你也可以这样做this @Benipro98 一个问题,因为我真的不知道。是否有理由在 2020 年不使用 Storyboard?恕我直言,这要简单得多。 是的,我会使用它。进入它需要一点时间,但是一切都变得容易得多,尤其是自动布局。我会推荐你​​this very good tutorial site。

以上是关于Swift:按下collectionView项目时推送新视图的主要内容,如果未能解决你的问题,请参考以下文章

使用Swift 3单击collectionView单元格内的项目时如何导航另一个视图控制器

在 CollectionView Swift4 中选择第一个项目

Swift 动画 CollectionView 项目点击

在 Swift 中以编程方式为 CollectionView 设置插图

Swift 3:在 CollectionView 中选择时放大图像

当按下相应视图控制器的 tabBar 图标时,如何将 collectionView 带回顶部?