起きた問題
タイトルの通り、IBOutletでstoryboadにて設定したUIImageViewに画像が表示されなくなったことがありました。
状況としては、コードでUIImageを設定した時に設定したはずの画像が表示されないというものです。
実際のコード
以下実際の画像が表示できなくなったコードです。
ChatIconView
というカスタムViewでUIImageViewがあり、setupMyIcon
もしくはsetupTeamMemberIcon
で画像を設定するようになっています。
しかし、setupTeamMemberIcon
では画像が表示されません。
class ChatIconView: UIView {
// MARK: - IBOutlet property
@IBOutlet var iconImageView: UIImageView!
// MARK: - initialize Methods
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)!
loadNib()
}
override init(frame: CGRect) {
super.init(frame: frame)
loadNib()
}
override class func awakeFromNib() {
super.awakeFromNib()
}
// MARK: - public Methods
func setupMyIcon(iconImage: UIImage) {
iconImageView.image = iconImage
}
func setupTeamMemberIcon(imageLoader: LoadingImage) { // 問題のコード
iconImageView = UIImageView(imageLoader)
}
}
// MARK: - private Methods
private extension ChatIconView {
func loadNib() {
let view = UINib(nibName: K.Storyboad.Xib.chatIconView, bundle: nil).instantiate(withOwner: self,
options: nil)
.first as! UIView
view.frame = self.bounds
self.addSubview(view)
}
}
結論
setupTeamMemberIcon
では、IBOutletのUIImageViewのオブジェクトをコード上で上書きしてしまっていたためでした。
UIを表示しているのはあくまでstoryboad側の方であり、IBOutletでUIImageViewを参照しているに過ぎないため、そのプロパティに別のUIImageViewを上書きするとstoryboad上のUIImageView(実際に画面に表示されている方)とは別のUIImageViewを参照することとなるためこちらに画像を設定しても画面上では表示されないということになります。
おわり
改めて考えてみると、当たり前な内容でハマってしまいましたが、IBOutletの構造を改めて再認識できました。