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 设置插图