I currently have a data type called MovieCard that holds all the data regarding a movie and it needs to be displayed onto a card, aka a UIView. I have created a custom UIView class called MovieCardView and have linked it to a XIB file through File's Owner. The MovieCardView contains a few labels and an image view.
My question is, what do I have to write inside the MovieCardView file (I'm confused regarding bundle loading) and how can I pass in the movie card to the MovieCardView? I want the MovieCardView to utilise the data present in the movie card to set some values for the labels and ImageView in the MovieCardView.
This is what is in my view controller and what I wish to happen
func koloda(_ koloda: KolodaView, viewForCardAt index: Int) -> UIView {
let movieCard = cards[index]
return MovieCardView(movieCard: movieCard)
}
And my current view file looks like this
class MovieCardView: UIView {
@IBOutlet var moviePoster: UIImageView!
@IBOutlet var movieTitle: UILabel!
@IBOutlet var movieYear: UILabel!
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
Bundle.main.loadNibNamed("MovieCardView", owner: self, options: nil)
}
}
I'm not sure how to modify the code to allow me to pass in the movieCard from my view controller and programatically set the IBOutlets to certain properties of my movieCard. I also do not wish to programatically change the frame at all. Any help would be appreciated. Thank you!
Update I have tried the following
import UIKit
import Kingfisher
class MovieCardView: UIView {
@IBOutlet weak var poster: UIImageView!
let movieCard: MovieCard
override init(frame: CGRect) {
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commonInit()
}
func commonInit() {
Bundle.main.loadNibNamed("MovieCardView", owner: self, options: nil)
guard let posterString = movieCard.poster_path else {
return
}
let urlString = "https://image.tmdb.org/t/p/w300" + posterString
guard let posterImageURL = URL(string: urlString) else {
return
}
poster.kf.setImage(with: posterImageURL)
}
}
I am getting errors saying Property 'self.movieCard' not initialized at super.init call for both override init and required init methods. How do I rectify this? Thanks!