Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在子类中使用new collectionView?_Swift_Uicollectionview - Fatal编程技术网

Swift 如何在子类中使用new collectionView?

Swift 如何在子类中使用new collectionView?,swift,uicollectionview,Swift,Uicollectionview,我有一个baseController,我在其中设置了一个topView。在该topView中,我使用了名为BaseCollectionViewCell的UICollectionView。现在我有了一个名为HomeViewController的新ViewController,它是BaseViewController的子类。我需要在我的HomeVC中有一个新的collectionView,因此我创建了一个名为HomeCollectionViewCell的新的UICollectionViewCell类

我有一个baseController,我在其中设置了一个topView。在该topView中,我使用了名为
BaseCollectionViewCell
UICollectionView
。现在我有了一个名为
HomeViewController
的新ViewController,它是
BaseViewController
的子类。我需要在我的
HomeVC
中有一个新的collectionView,因此我创建了一个名为
HomeCollectionViewCell
的新的
UICollectionViewCell
类,但现在当我尝试使用它时,应用程序崩溃,出现以下错误:

无法将“MyApplicationName.BaseCollectionViewCell”类型的值强制转换为“MyApplicationName.HomeCollectionViewCell”

如何在我的
HomeVC
类中使用新的collectionView?任何帮助都将不胜感激

BaseViewController

import UIKit
import WebKit

class BaseViewController: UIViewController {

let containerView: UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    return v
}()

let topView:UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .navRedColor
    v.layer.cornerRadius = 45
    v.layer.maskedCorners = [.layerMaxXMaxYCorner]
    return v
}()

var searchBarView:UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .white
    v.layer.cornerRadius = 10
    return v
}()

var searchTextField: UITextField = {
    let fld = UITextField()
    fld.translatesAutoresizingMaskIntoConstraints = false
    fld.placeholder = "Search Movie here"
    fld.textColor = .black
    fld.backgroundColor = .white
    fld.layer.cornerRadius = 10
    return fld
}()

var searchIconImageView: UIImageView = {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.image = #imageLiteral(resourceName: "searchIcon")
    return v
}()

var movieChoiceLabel: UILabel = {
    let lbl = UILabel()
    lbl.translatesAutoresizingMaskIntoConstraints = false
    lbl.text = "Movies of your\nchoice"
    lbl.numberOfLines = 0
    lbl.font = UIFont.systemFont(ofSize: 32, weight: .bold)
    lbl.textColor = .white
    let attrbText = NSMutableAttributedString(string: lbl.text!)
    let range = (lbl.text! as NSString).range(of: "choice")
    attrbText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.white.cgColor, range: range)
    lbl.attributedText = attrbText
    lbl.isUserInteractionEnabled = true
    
    
    return lbl
}()

var profileImageView: UIImageView = {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.layer.cornerRadius = 25
    v.image = #imageLiteral(resourceName: "profileImage")
    v.clipsToBounds = true
    return v
}()

lazy var movieStatusCollectionView : UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    collectionView.backgroundColor = .navRedColor
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

let collections = ["Latest", "Trending", "Upcoming"]
let collectionViewCellID = "cellID"

override func viewDidLoad() {
    super.viewDidLoad()
    
    view.backgroundColor = .white
    self.navigationController?.navigationBar.isTranslucent = false
    self.navigationController?.changeStatusBarColor(color: .navRedColor)
    movieStatusCollectionView.register(BaseCollectionViewCell.self, forCellWithReuseIdentifier: collectionViewCellID)
    setupViews()
    movieChoiceLabel.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(tapLabel(gesture:))))
}

func setupViews() {
    
    //AddSubviews
    view.addSubview(containerView)
    containerView.addSubview(topView)
    topView.addSubview(searchBarView)
    topView.addSubview(searchTextField)
    searchBarView.addSubview(searchIconImageView)
    topView.addSubview(movieChoiceLabel)
    topView.addSubview(profileImageView)
    topView.addSubview(movieStatusCollectionView)
    
    //Constraints
    NSLayoutConstraint.activate([
        
        //ContainerView
        containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        containerView.topAnchor.constraint(equalTo: view.topAnchor),
        containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        
        //TopView
        topView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
        topView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
        topView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 0),
        topView.heightAnchor.constraint(equalToConstant: 256),
        
        //SearchBarView
        searchBarView.leadingAnchor.constraint(equalTo: topView.leadingAnchor, constant: 20),
        searchBarView.trailingAnchor.constraint(equalTo: topView.trailingAnchor, constant: -20),
        searchBarView.topAnchor.constraint(equalTo: topView.topAnchor),
        searchBarView.heightAnchor.constraint(equalToConstant: 46),
        
        //SearchIconImageView
        searchIconImageView.leadingAnchor.constraint(equalTo: searchBarView.leadingAnchor, constant: 20),
        searchIconImageView.centerYAnchor.constraint(equalTo: searchBarView.centerYAnchor),
        searchIconImageView.widthAnchor.constraint(equalToConstant: 24),
        searchIconImageView.heightAnchor.constraint(equalToConstant: 24),
        
        //SearchTextField
        searchTextField.leadingAnchor.constraint(equalTo: searchIconImageView.trailingAnchor, constant: 15),
        searchTextField.trailingAnchor.constraint(equalTo: searchBarView.trailingAnchor),
        searchTextField.topAnchor.constraint(equalTo: searchBarView.topAnchor),
        searchTextField.bottomAnchor.constraint(equalTo: searchBarView.bottomAnchor),
        
        //MovieChoiceLabel
        movieChoiceLabel.leadingAnchor.constraint(equalTo: searchBarView.leadingAnchor),
        movieChoiceLabel.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant: 50),
        movieChoiceLabel.topAnchor.constraint(equalTo: searchBarView.bottomAnchor, constant: 24),
        
        //ProfileImageView
        profileImageView.trailingAnchor.constraint(equalTo: searchBarView.trailingAnchor),
        profileImageView.topAnchor.constraint(equalTo: searchBarView.bottomAnchor, constant: 24),
        profileImageView.widthAnchor.constraint(equalToConstant: 50),
        profileImageView.heightAnchor.constraint(equalToConstant: 50),
        
        //MovieCollectionView
        movieStatusCollectionView.leadingAnchor.constraint(equalTo: topView.leadingAnchor, constant: 28),
        movieStatusCollectionView.trailingAnchor.constraint(equalTo: topView.trailingAnchor, constant: -28),
        movieStatusCollectionView.topAnchor.constraint(equalTo: movieChoiceLabel.bottomAnchor, constant: 24),
        movieStatusCollectionView.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: -10),
        
    ])
    
}

extension BaseViewController:  UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewCellID, for: indexPath) as! BaseCollectionViewCell
    cell.headinLabel.text = collections[indexPath.item]
    if indexPath.item == 0 {
        cell.separatorLine.isHidden = false
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 90, height: 30)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: (collectionView.frame.height / 2) , left: -2, bottom: 0, right: 12)
}
import UIKit

class HomeViewController: BaseViewController {

var topTrendingLabel: UILabel = {
    let lbl = UILabel()
    lbl.translatesAutoresizingMaskIntoConstraints = false
    lbl.text = "Top Trendings"
    lbl.textColor = .black
    lbl.font = UIFont.systemFont(ofSize: 20, weight: .medium)
    return lbl
}()

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let v = UICollectionView(frame: .zero, collectionViewLayout: layout)
    v.translatesAutoresizingMaskIntoConstraints = false
    v.delegate = self
    v.dataSource = self
    return v
}()

var topTrendings: [TrendingMovies] = {
    let movie1 = TrendingMovies(imageName: "badboys", movieName: "Bad Boys")
    let movie2 = TrendingMovies(imageName: "angrymen", movieName: "12 Angry Men")
    return [movie1, movie2]
}()

let collectionCellID = "cellID"

override func viewDidLoad() {
    super.viewDidLoad()
    self.collectionView.register(HomeCollectionViewCell.self, forCellWithReuseIdentifier: collectionCellID)
}

override func setupViews() {
    super.setupViews()
    
    containerView.addSubview(topTrendingLabel)
    containerView.addSubview(collectionView)
    
    NSLayoutConstraint.activate([
        
        //TopTrending
        topTrendingLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 20),
        topTrendingLabel.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 24),
        
        //CollectionView
        collectionView.leadingAnchor.constraint(equalTo: topTrendingLabel.leadingAnchor),
        collectionView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -20),
        collectionView.widthAnchor.constraint(equalToConstant: 170),
        collectionView.heightAnchor.constraint(equalToConstant: 220),
        
    ])
}

//CollectionView
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionCellID, for: indexPath) as! HomeCollectionViewCell
    cell.backgroundColor = .blue
    return cell
}

override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 170, height: 220)
}


}
}

HomeViewController

import UIKit
import WebKit

class BaseViewController: UIViewController {

let containerView: UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    return v
}()

let topView:UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .navRedColor
    v.layer.cornerRadius = 45
    v.layer.maskedCorners = [.layerMaxXMaxYCorner]
    return v
}()

var searchBarView:UIView = {
    let v = UIView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.backgroundColor = .white
    v.layer.cornerRadius = 10
    return v
}()

var searchTextField: UITextField = {
    let fld = UITextField()
    fld.translatesAutoresizingMaskIntoConstraints = false
    fld.placeholder = "Search Movie here"
    fld.textColor = .black
    fld.backgroundColor = .white
    fld.layer.cornerRadius = 10
    return fld
}()

var searchIconImageView: UIImageView = {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.image = #imageLiteral(resourceName: "searchIcon")
    return v
}()

var movieChoiceLabel: UILabel = {
    let lbl = UILabel()
    lbl.translatesAutoresizingMaskIntoConstraints = false
    lbl.text = "Movies of your\nchoice"
    lbl.numberOfLines = 0
    lbl.font = UIFont.systemFont(ofSize: 32, weight: .bold)
    lbl.textColor = .white
    let attrbText = NSMutableAttributedString(string: lbl.text!)
    let range = (lbl.text! as NSString).range(of: "choice")
    attrbText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.white.cgColor, range: range)
    lbl.attributedText = attrbText
    lbl.isUserInteractionEnabled = true
    
    
    return lbl
}()

var profileImageView: UIImageView = {
    let v = UIImageView()
    v.translatesAutoresizingMaskIntoConstraints = false
    v.layer.cornerRadius = 25
    v.image = #imageLiteral(resourceName: "profileImage")
    v.clipsToBounds = true
    return v
}()

lazy var movieStatusCollectionView : UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let collectionView = UICollectionView(frame: .zero, collectionViewLayout: layout)
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    collectionView.backgroundColor = .navRedColor
    collectionView.delegate = self
    collectionView.dataSource = self
    return collectionView
}()

let collections = ["Latest", "Trending", "Upcoming"]
let collectionViewCellID = "cellID"

override func viewDidLoad() {
    super.viewDidLoad()
    
    view.backgroundColor = .white
    self.navigationController?.navigationBar.isTranslucent = false
    self.navigationController?.changeStatusBarColor(color: .navRedColor)
    movieStatusCollectionView.register(BaseCollectionViewCell.self, forCellWithReuseIdentifier: collectionViewCellID)
    setupViews()
    movieChoiceLabel.addGestureRecognizer(UITapGestureRecognizer(target:self, action: #selector(tapLabel(gesture:))))
}

func setupViews() {
    
    //AddSubviews
    view.addSubview(containerView)
    containerView.addSubview(topView)
    topView.addSubview(searchBarView)
    topView.addSubview(searchTextField)
    searchBarView.addSubview(searchIconImageView)
    topView.addSubview(movieChoiceLabel)
    topView.addSubview(profileImageView)
    topView.addSubview(movieStatusCollectionView)
    
    //Constraints
    NSLayoutConstraint.activate([
        
        //ContainerView
        containerView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
        containerView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
        containerView.topAnchor.constraint(equalTo: view.topAnchor),
        containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        
        //TopView
        topView.leadingAnchor.constraint(equalTo: containerView.leadingAnchor),
        topView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor),
        topView.topAnchor.constraint(equalTo: containerView.topAnchor, constant: 0),
        topView.heightAnchor.constraint(equalToConstant: 256),
        
        //SearchBarView
        searchBarView.leadingAnchor.constraint(equalTo: topView.leadingAnchor, constant: 20),
        searchBarView.trailingAnchor.constraint(equalTo: topView.trailingAnchor, constant: -20),
        searchBarView.topAnchor.constraint(equalTo: topView.topAnchor),
        searchBarView.heightAnchor.constraint(equalToConstant: 46),
        
        //SearchIconImageView
        searchIconImageView.leadingAnchor.constraint(equalTo: searchBarView.leadingAnchor, constant: 20),
        searchIconImageView.centerYAnchor.constraint(equalTo: searchBarView.centerYAnchor),
        searchIconImageView.widthAnchor.constraint(equalToConstant: 24),
        searchIconImageView.heightAnchor.constraint(equalToConstant: 24),
        
        //SearchTextField
        searchTextField.leadingAnchor.constraint(equalTo: searchIconImageView.trailingAnchor, constant: 15),
        searchTextField.trailingAnchor.constraint(equalTo: searchBarView.trailingAnchor),
        searchTextField.topAnchor.constraint(equalTo: searchBarView.topAnchor),
        searchTextField.bottomAnchor.constraint(equalTo: searchBarView.bottomAnchor),
        
        //MovieChoiceLabel
        movieChoiceLabel.leadingAnchor.constraint(equalTo: searchBarView.leadingAnchor),
        movieChoiceLabel.trailingAnchor.constraint(equalTo: view.centerXAnchor, constant: 50),
        movieChoiceLabel.topAnchor.constraint(equalTo: searchBarView.bottomAnchor, constant: 24),
        
        //ProfileImageView
        profileImageView.trailingAnchor.constraint(equalTo: searchBarView.trailingAnchor),
        profileImageView.topAnchor.constraint(equalTo: searchBarView.bottomAnchor, constant: 24),
        profileImageView.widthAnchor.constraint(equalToConstant: 50),
        profileImageView.heightAnchor.constraint(equalToConstant: 50),
        
        //MovieCollectionView
        movieStatusCollectionView.leadingAnchor.constraint(equalTo: topView.leadingAnchor, constant: 28),
        movieStatusCollectionView.trailingAnchor.constraint(equalTo: topView.trailingAnchor, constant: -28),
        movieStatusCollectionView.topAnchor.constraint(equalTo: movieChoiceLabel.bottomAnchor, constant: 24),
        movieStatusCollectionView.bottomAnchor.constraint(equalTo: topView.bottomAnchor, constant: -10),
        
    ])
    
}

extension BaseViewController:  UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionViewCellID, for: indexPath) as! BaseCollectionViewCell
    cell.headinLabel.text = collections[indexPath.item]
    if indexPath.item == 0 {
        cell.separatorLine.isHidden = false
    }
    return cell
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 90, height: 30)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: (collectionView.frame.height / 2) , left: -2, bottom: 0, right: 12)
}
import UIKit

class HomeViewController: BaseViewController {

var topTrendingLabel: UILabel = {
    let lbl = UILabel()
    lbl.translatesAutoresizingMaskIntoConstraints = false
    lbl.text = "Top Trendings"
    lbl.textColor = .black
    lbl.font = UIFont.systemFont(ofSize: 20, weight: .medium)
    return lbl
}()

lazy var collectionView: UICollectionView = {
    let layout = UICollectionViewFlowLayout()
    let v = UICollectionView(frame: .zero, collectionViewLayout: layout)
    v.translatesAutoresizingMaskIntoConstraints = false
    v.delegate = self
    v.dataSource = self
    return v
}()

var topTrendings: [TrendingMovies] = {
    let movie1 = TrendingMovies(imageName: "badboys", movieName: "Bad Boys")
    let movie2 = TrendingMovies(imageName: "angrymen", movieName: "12 Angry Men")
    return [movie1, movie2]
}()

let collectionCellID = "cellID"

override func viewDidLoad() {
    super.viewDidLoad()
    self.collectionView.register(HomeCollectionViewCell.self, forCellWithReuseIdentifier: collectionCellID)
}

override func setupViews() {
    super.setupViews()
    
    containerView.addSubview(topTrendingLabel)
    containerView.addSubview(collectionView)
    
    NSLayoutConstraint.activate([
        
        //TopTrending
        topTrendingLabel.leadingAnchor.constraint(equalTo: containerView.leadingAnchor, constant: 20),
        topTrendingLabel.topAnchor.constraint(equalTo: topView.bottomAnchor, constant: 24),
        
        //CollectionView
        collectionView.leadingAnchor.constraint(equalTo: topTrendingLabel.leadingAnchor),
        collectionView.trailingAnchor.constraint(equalTo: containerView.trailingAnchor, constant: -20),
        collectionView.widthAnchor.constraint(equalToConstant: 170),
        collectionView.heightAnchor.constraint(equalToConstant: 220),
        
    ])
}

//CollectionView
override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return 3
}

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: collectionCellID, for: indexPath) as! HomeCollectionViewCell
    cell.backgroundColor = .blue
    return cell
}

override func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: 170, height: 220)
}


}

任何帮助都将不胜感激

您必须覆盖HomeViewController中的cellForItemAt方法,然后一种方法是检查cellForItemAt方法中的collectionView i、 e


在HomeVC的所有集合视图重写方法中,添加一个类似numberOfItem add-if collectionView==self.collectionView{returns 3}的条件,否则为0。与cellForRow方法中的相同-如果collectionView==self.collectionView{//您的代码}否则返回UICollectionViewCell(),当我们在同一个类中有多个collectionView时,这种情况很好。在我的例子中,基类中有一个collectionView,然后在继承的类中,我声明了一个新的集合视图,这导致了问题。我已经尝试了你上面提到的方法,但它只是选择了与BaseController相同的集合视图。你救了我的周末兄弟!