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

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

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

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

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

【问题讨论】:

    标签: ios swift uicollectionview


    【解决方案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 标识符?
    • 我想我在这里找到了答案:stackoverflow.com/questions/41767655/…
    • @Benipro98 你也可以这样做this
    • @Benipro98 一个问题,因为我真的不知道。是否有理由在 2020 年不使用 Storyboard?恕我直言,这要简单得多。
    • 是的,我会使用它。进入它需要一点时间,但是一切都变得容易得多,尤其是自动布局。我会推荐你​​this very good tutorial site
    猜你喜欢
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-23
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多