为什么我不能使用图像变量来更改 UI 图像中的图像

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

我正在尝试创建一组 5 个具有不同图像和文本的引导屏幕。为了使我的代码更清晰,我只需要一个为当前屏幕设置图像的函数。

我当前的功能是这样的:

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
    }()

我希望能够做这样的事情...

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

    }()

我可以将 currentImage 变量更改为在 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?

当我收到错误时,我的问题就来了:Instance member 'currentImage' cannot be used on type 'ViewController' 我不明白为什么。我已经查看了其他相关问题,但它们似乎没有帮助。

这里你需要一个函数而不是一个实例属性

func getImgaeV(_ imageName:String) -> UIImageView { 
    let imageView = UIImageView(image: imageName)
    imageView.frame = CGRect(x: 0, y: 0, width: 250, height: 250)
    return imageView
}

facebookImage = getImgaeV("facebook_icon")
twitterImage = getImgaeV("twitter_icon")

我认为你们的属性有些相似,所以你可以这样做

var allImageViews = [UIImageView]()

然后里面 viewDidLoad

allImageViews =   ["facebook_icon","twitter_icon"].map { getImgaeV([=13=]) }

我不确定这是否是最佳做法,但我基本上初始化了我想更新的图像并使用 else if 语句来更改图像。

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