I am trying to create a set of 5 lead-up screens with different images and text. To make my code cleaner I want only one function that sets the image for the current screen.
My current function is this:
private let facebookImage: UIImageView = {
let image = #imageLiteral(resourceName: "facebook_icon")
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
I want to be able to do something like this...
private let displayImage: UIImageView = {
let image = currentImage
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 200, height: 200)
return imageView
}()
where I can change the currentImage
variable to the image literal declared within the class:
var twitter : UIImage = #imageLiteral(resourceName: "twitter_icon")
var facebook : UIImage = #imageLiteral(resourceName: "facebook_icon")
var linkedin : UIImage = #imageLiteral(resourceName: "linkedin_icon")
var instagram : UIImage = #imageLiteral(resourceName: "instagram_icon")
var youtube : UIImage = #imageLiteral(resourceName: "youtube_icon")
weak var currentImage : UIImage?
My issue comes in when I get the error: Instance member 'currentImage' cannot be used on type 'ViewController'
and I don't understand why. I have reviewed other questions related but they don't seem to help.
Im not sure if this is the best practice to do but I basically initialized the image I wanted to update and used else if statements to change the image.
import UIKit
class ViewController: UIViewController {
var tapCount : Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
view.addSubview(displayImage)
view.addSubview(displayText)
setupControls()
setupLayout()
}
// Initalized the display image to facebook icon and is updated when next or previous is tapped
private let displayImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
return imageView
}()
private let displayText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
private let nextButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("NEXT", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(nextButtonTapped), for: .touchUpInside)
return button
}()
@objc func nextButtonTapped() {
tapCount += 1
pageCounter.currentPage += 1
updatePageContent()
print("NEXT \(tapCount)")
}
@objc func backButtonTapped() {
tapCount -= 1
pageCounter.currentPage -= 1
updatePageContent()
print("PREV \(tapCount)")
}
func updatePageContent() {
if tapCount == -1 {
tapCount = 0
} else if tapCount == 0 {
displayImage.image = facebookImage.image
} else if tapCount == 1 {
displayImage.image = twitterImage.image
} else if tapCount == 2 {
displayImage.image = instagramImage.image
} else if tapCount == 3 {
displayImage.image = linkedinImage.image
} else if tapCount == 4 {
displayImage.image = youtubeImage.image
} else if tapCount == 5 {
tapCount = 4
}
}
private let previousButton: UIButton = {
let button = UIButton(type: .system)
button.setTitle("PREV", for: .normal)
button.titleLabel?.font = UIFont.boldSystemFont(ofSize: 18)
button.addTarget(self, action: #selector(backButtonTapped), for: .touchUpInside)
return button
}()
private let pageCounter: UIPageControl = {
let control = UIPageControl()
control.currentPage = 0
control.numberOfPages = 5
control.currentPageIndicatorTintColor = .systemBlue
control.pageIndicatorTintColor = .gray
return control
}()
private let facebookImage: UIImageView = {
let imageName = "facebook_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let twitterImage: UIImageView = {
let imageName = "twitter_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let instagramImage: UIImageView = {
let imageName = "instagram_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let linkedinImage: UIImageView = {
let imageName = "linkedin_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let youtubeImage: UIImageView = {
let imageName = "youtube_icon.png"
let image = UIImage(named: imageName)
let imageView = UIImageView(image: image)
return imageView
}()
private let facebookText: UITextView = {
let textView = UITextView()
let attributedText = NSMutableAttributedString(string: "Like us on Facebook", attributes: [NSAttributedString.Key.font: UIFont.boldSystemFont(ofSize: 18)])
attributedText.append(NSAttributedString(string: "\n\n\nLorem ipsum Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit.", attributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 14), NSAttributedString.Key.foregroundColor: UIColor.gray]))
textView.attributedText = attributedText
textView.textAlignment = .center
textView.isEditable = false
textView.isScrollEnabled = false
textView.translatesAutoresizingMaskIntoConstraints = false
return textView
}()
// Sets image and text properties
private func setupLayout() {
//Facebook icon constraints
displayImage.translatesAutoresizingMaskIntoConstraints = false
displayImage.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
displayImage.topAnchor.constraint(equalTo: view.topAnchor, constant: 100).isActive = true
displayImage.widthAnchor.constraint(equalToConstant: 250).isActive = true
displayImage.heightAnchor.constraint(equalToConstant: 250).isActive = true
//Description contraints
displayText.topAnchor.constraint(equalTo: displayImage.bottomAnchor, constant: 120).isActive = true
displayText.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 0).isActive = true
displayText.rightAnchor.constraint(equalTo: view.rightAnchor, constant: 0).isActive = true
displayText.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: 0).isActive = true
}
// Sets control buttons and counter
private func setupControls() {
view.addSubview(nextButton)
view.addSubview(previousButton)
view.addSubview(pageCounter)
//Next button constraints
nextButton.translatesAutoresizingMaskIntoConstraints = false
nextButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
nextButton.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
nextButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
nextButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Next button constraints
previousButton.translatesAutoresizingMaskIntoConstraints = false
previousButton.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
previousButton.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
previousButton.heightAnchor.constraint(equalToConstant: 50).isActive = true
previousButton.widthAnchor.constraint(equalToConstant: 120).isActive = true
// Counter contsraints
pageCounter.translatesAutoresizingMaskIntoConstraints = false
pageCounter.centerXAnchor.constraint(equalTo: view.centerXAnchor, constant: 0).isActive = true
pageCounter.centerYAnchor.constraint(equalTo: nextButton.centerYAnchor, constant: 0).isActive = true
pageCounter.leadingAnchor.constraint(equalTo: previousButton.trailingAnchor, constant: 5).isActive = true
pageCounter.trailingAnchor.constraint(equalTo: nextButton.leadingAnchor, constant: 5).isActive = true
}
}