【问题标题】:to dismiss a viewcontroller using collectionView cell使用 collectionView 单元关闭视图控制器
【发布时间】:2018-07-20 08:51:36
【问题描述】:

当我单击 collectionviewcell 时,我在关闭 viewController 时遇到了困难。所以我的collectionview被放置在一个uiview中,然后显示在一个viewcontroller中。每当用户单击 collectionViewCell 时,我希望视图触发放置在视图控制器内的 bye() 函数。我添加 print("bye") 只是为了看看它是否有效,它确实打印了这个词,但它不执行dismiss(animated: true, completion: nil) 来关闭视图控制器以及 uiview 和 collectionview。为什么它不解雇控制器?还有另一种方法可以让我做同样的事情吗?这是代码:

视图控制器

class sideViewController: UIViewController {

    let dismissBtn:UIButton = {
       let content = UIButton()
        content.backgroundColor = .green
        content.addTarget(self, action: #selector(bye), for: .touchUpInside)
        return content
    }()

    let sideTableViews: sideCollectionView = {
       let content = sideCollectionView()
        return content
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        dismissBtn.translatesAutoresizingMaskIntoConstraints = false
        sideTableViews.translatesAutoresizingMaskIntoConstraints = false

        view.addSubview(dismissBtn)
        view.addSubview(sideTableViews)

        dismissBtn.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
        dismissBtn.rightAnchor.constraint(equalTo: view.rightAnchor, constant: -10).isActive = true
        dismissBtn.widthAnchor.constraint(equalToConstant:40).isActive = true
        dismissBtn.heightAnchor.constraint(equalToConstant: 40).isActive = true

        sideTableViews.topAnchor.constraint(equalTo: dismissBtn.bottomAnchor, constant: 30).isActive = true
        sideTableViews.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
        sideTableViews.widthAnchor.constraint(equalTo: view.widthAnchor, constant: 0).isActive = true
        sideTableViews.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
    }

    @objc func membershipController(){
        let next = self.storyboard?.instantiateViewController(withIdentifier: "membershipViewController") as! membershipViewController
        self.present(next, animated: true, completion: nil)
    }

    @objc func bye(){
        print("bye")
        dismiss(animated: true, completion: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

这是collectionView代码和uiview

class sideCollectionView:UIView, UICollectionViewDelegateFlowLayout,UICollectionViewDataSource {
    let arrayLbl = ["connection","achievement","template","setting"]
    let arrayImg = ["connection","achievement","template","setting"]
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return arrayLbl.count
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! sideCollectionViewCell
        cell.titleImg.image = UIImage(named: "\(arrayImg[indexPath.row])")
        cell.titleLbl.text = arrayLbl[indexPath.row]
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
        return CGSize(width: (self.frame.width / 2) - 40, height: (self.frame.width / 2) - 40)
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsMake(25, 25, 10, 25)
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if indexPath.row == 0{
            connectController()
            print("connection")
            let side = sideViewController()
            side.bye()
        }
        if indexPath.row == 1{
            let side = sideViewController()
            side.bye()
            print("achievement")
        }
        if indexPath.row == 2{
            let side = sideViewController()
            side.bye()
            print("template")
        }
        if indexPath.row == 3{
            let side = sideViewController()
            side.bye()
            print("setting")
        }
    }

    lazy var collectionViews: 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)
        setupViews()
    }

    func setupViews(){
        collectionViews.register(sideCollectionViewCell.self, forCellWithReuseIdentifier: "cell")
        collectionViews.translatesAutoresizingMaskIntoConstraints = false
        backgroundColor = UIColor.clear
        addSubview(collectionViews)
        collectionViews.topAnchor.constraint(equalTo: topAnchor, constant: 0).isActive = true
        collectionViews.bottomAnchor.constraint(equalTo: bottomAnchor, constant: 0).isActive = true
        collectionViews.centerYAnchor.constraint(equalTo: centerYAnchor, constant: 0).isActive = true
        collectionViews.centerXAnchor.constraint(equalTo: centerXAnchor, constant: 0).isActive = true
        collectionViews.widthAnchor.constraint(equalTo: widthAnchor, constant: 0).isActive = true
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    @objc func connectController(){
        let side = sideViewController()
        side.bye()
    }

    @objc func settingController(){
        let side = sideViewController()
        side.bye()
    }

    @objc func achievementController(){
        let side = sideViewController()
        side.bye()
    }

    @objc func templateController(){
        let side = sideViewController()
        side.bye()
    }
}

【问题讨论】:

    标签: swift


    【解决方案1】:

    因为这个

     let side = sideViewController()
    

    是另一个实例而不是显示的实例,所以将此 var 添加到视图中

    class sideCollectionView:UIView {
      var currentVc:sideViewController?
    
    }
    

    //

    当你创建变量时分配它

    lazy var sideTableViews: sideCollectionView = {
       let content = sideCollectionView()
       content.currentVc = self
       return content
    }()
    

    //

    里面

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        if indexPath.row == 0{
            connectController()
            print("connection")
            currentVc?.bye()
        }
    }
    

    【讨论】:

    • 我在 content.currentVc = self ||||||| 上遇到了这个错误无法将“(sideViewController)->()->(sideViewController)”类型的值分配给“sideViewCont”
    • 谢谢它的工作:)。顺便说一句,什么是懒惰?它对我来说是新的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 2016-06-07
    • 2019-05-23
    • 2017-01-06
    • 1970-01-01
    相关资源
    最近更新 更多