我正在尝试使应用程序起作用,以便当用户按下其中一幅图像(即按钮)时,背景将发生变化。我的问题是,当按下按钮时,背景不会更改为图片。我一直在寻找答案,但一无所获。有人能帮忙吗? https://i.stack.imgur.com/boEiZ.png <-图片已在此处链接,因为堆栈溢出不允许我嵌入图片。
@IBOutlet weak var background: NSImageView!
let grass = NSImage(named :NSImage.Name(rawValue: "wetgrass"))
override func viewDidLoad() {
super.viewDidLoad()
// Do view setup here.
background.image = grass
}
@IBAction func changeGrass(_ sender: Any) {
background.image = grass
}
}
答案 0 :(得分:0)
以下是经过测试的答案
@IBAction func btnChangeImageClick(_ sender: UIButton) {
let imageFromButton : UIImage = sender.image(for: UIControlState.normal)!
imgBG.image = imageFromButton
}
注意:我在操作UIButton时使用Any,因此我们可以从该发送方对象获取图像
答案 1 :(得分:0)
如何解决问题:
viewDidLoad
✓图像加载失败:
let grass = NSImage(named: NSImage.Name(rawValue: "wetgrass"))
NSImage.init?(named:)生成NSImage?
或Optional<NSImage>
,这意味着加载具有该名称的图像文件可能会失败。当您肯定...... p时,请使用此初始化程序
Bundle
包含一个名为“ wetgrass.png”的图像文件,该图像文件已复制到应用程序中(请检查“构建设置”>“复制捆绑包资源”),因此grass
可能是nil
。并且如果为零,则您对background.image
的分配将只删除任何先前设置的图像(如果有的话),将NSImageView
重置为显示无聊的灰色背景。
要最终隔离并检查图像分配是否有效,请使用保证存在的图像,例如内置图像:
let testImage = NSImage(named: .advanced)!
请注意,由于NSImage.Name.advanced
可以保证产生图像,因此我会在此处强制打开可选内容:)
这应该可以:
override func viewDidLoad() {
super.viewDidLoad()
// Show initial image:
background.image = NSImage(named: .advanced)!
}
@IBAction func changeGrass(_ sender: Any) {
// Show grass or another built-in image:
background.image = grass ?? NSImage(named: .computer)!
}
因此,请检查您的grass != nil
答案 2 :(得分:0)
尝试一下:
@IBAction func changeGrass(_ sender: Any) {
if let myButton = sender as? UIButton, let currentImage = myButton.imageView?.image {
background.image = currentImage
// Animated
UIView.transition(with: background,
duration: 0.75,
options: .transitionCrossDissolve,
animations: {
self.background.image = currentImage
})
}
}