Swift 4 - Нажмите ViewController из ячейки UICollectionView - PullRequest
0 голосов
/ 22 ноября 2018

Я застрял в своем проекте и мне нужна помощь.Я хочу нажать / представить UICollectionViewController из UICollectionViewCell , включая мой UINavigationBar.Я понимаю, что вы не можете на самом деле представить ViewController из ячейки?Как я должен поступить в этом случае?Моя проблема в том, что мой NavigationBar не будет отображаться.

Вот моя ячейка:

import UIKit
import Firebase

class UserProfileHeader: UICollectionViewCell, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

lazy var followersLabelButton: UIButton = {
    let button = UIButton(type: .system)
    button.setTitle("followers", for: .normal)
    button.setTitleColor(UIColor.lightGray, for: .normal)
    button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
    button.addTarget(self, action: #selector(followers), for: .touchUpInside)
    return button
}()

@objc fileprivate func followers() {

    let newController = NewController(collectionViewLayout: UICollectionViewFlowLayout())

    self.window?.rootViewController?.present(newController, animated: true, completion: nil)


    }

   }

И контроллер CollectionViewController:

import UIKit
import MapKit
import Firebase

class UserProfileController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UIGestureRecognizerDelegate {

    var userId: String?

    override func viewDidLoad() {
        super.viewDidLoad()

        collectionView?.backgroundColor = UIColor.white


        collectionView?.register(UserProfileHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerId")

    }


    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerId", for: indexPath) as! UserProfileHeader

        header.user = self.user

        return header
    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {


        return CGSize(width: view.frame.width, height: 200)


    }


}

Ответы [ 4 ]

0 голосов
/ 22 ноября 2018

Я действительно думаю, что вам вообще не следует представлять из ячейки, даже если у вас есть ссылка на viewController.Я бы предпочел вызвать функцию делегата и оставить ее, чтобы решить, что делать -

import UIKit
import Firebase

protocol UserProfileHeaderDelegate: class {
    func followersTapped()
}


class UserProfileHeader: UICollectionViewCell, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    weak var headerDelegate: UserProfileHeaderDelegate?

    lazy var followersLabelButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("followers", for: .normal)
        button.setTitleColor(UIColor.lightGray, for: .normal)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        button.addTarget(self, action: #selector(followers), for: .touchUpInside)
        return button
    }()

    @objc fileprivate func followers() {
        self.headerDelegate?.followersTapped()
    }
}

В viewController -

class UserProfileController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UserProfileHeaderDelegate {

    // etc, etc......

    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerId", for: indexPath) as! UserProfileHeader

        header.user = self.user

        // Remember to set the delegate for the cell
        header.headerDelegate = self

        return header
    }


    // Implement the UserProfileHeaderDelegate protocol - this is called from within the cell
    // so all the cell knows is that its delegate implements this protocol, which has the followersTapped() function

    func followersTapped() {
        let newController = NewController(collectionViewLayout: UICollectionViewFlowLayout())
        self.present(newController, animated: true, completion: nil)
    }
}

Таким образом, ваш viewController не связан свнутренняя работа вашей камеры, и наоборот.

0 голосов
/ 22 ноября 2018

Если вы хотите представить новый ViewController, вы должны создать новый делегат в своей ячейке следующим образом:

import UIKit
import Firebase

protocol CellDelegate {
    func presentViewController()
}    

class UserProfileHeader: UICollectionViewCell, 
UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    var delegate: CellDelegate?

    lazy var followersLabelButton: UIButton = {
        let button = UIButton(type: .system)
        button.setTitle("followers", for: .normal)
        button.setTitleColor(UIColor.lightGray, for: .normal)
        button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 14)
        button.addTarget(self, action: #selector(followers), for: .touchUpInside)
        return button
    }()

    @objc func followers() {
        delegate.presentViewController
    }

}

В то время как в вашем ViewController вы должны заставить функцию делегата работать следующим образом

import UIKit
import MapKit
import Firebase

class UserProfileController: UICollectionViewController, UICollectionViewDelegateFlowLayout, UIGestureRecognizerDelegate
 , CellDelegate {

    var userId: String?

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView?.backgroundColor = UIColor.white
        collectionView?.register(UserProfileHeader.self, forSupplementaryViewOfKind: UICollectionView.elementKindSectionHeader, withReuseIdentifier: "headerId")
    }


    override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerId", for: indexPath) as! UserProfileHeader

        header.user = self.user

        // Remember to set the delegate for the cell
        header.delegate = self

        return header
    }


    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {
        return CGSize(width: view.frame.width, height: 200)
    }

    func presentViewController() {
        let newController = NewController(collectionViewLayout: UICollectionViewFlowLayout())

        self.window?.rootViewController?.present(newController, animated: true, completion: nil)
    }

}
0 голосов
/ 22 ноября 2018

это не правильный способ сделать это на виду.Используйте MVC-способ: переместите

button.addTarget(self, action: #selector(followers), for: .touchUpInside)

в UserProfileController в методе

override func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
        let header = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "headerId", for: indexPath) as! UserProfileHeader as! UserProfileHeader
        header.followersLabelButton.addTarget(self, action: #selector(followers), for: .touchUpInside)
        header.user = self.user

        return header
    }

и перепишите

@objc func followers() {

    let newController = self.navigationController

    newController?.present(newController, animated: true, completion: nil)


}
0 голосов
/ 22 ноября 2018

1- Внутри ячейки

weak var delegate:UserProfileController?

2- Внутри cellForItemAt

cell.delegate = self

3- Используйте это внутри ячейки

delegate?.present(newController, animated: true, completion: nil)

Кстатидумаю, что вы имеете в виду

delegate?.navigationController?.pushViewController(newController, animated: true)  
...