Search code examples
swiftuiimageviewuiimage

Why can't I use an image variable to change the image inside of a UI Image


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.


Solution

  • 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
        }
    }