视图控制器仅在第一次正确加载图像
Posted
技术标签:
【中文标题】视图控制器仅在第一次正确加载图像【英文标题】:View controller only loading images correctly the first time 【发布时间】:2017-10-28 04:29:59 【问题描述】:我正在使用视图控制器来动态显示按钮和带有图像的按钮。我在我的应用程序的不同级别重用了这个视图控制器。第一次打开时,它会正确显示图像。当我退后一步并重新打开同一个视图时,它会显示所有按钮上加载的最后一张图片。
以下是显示它第一次正常工作但第二次没有正常工作的屏幕截图。我做错了什么?
正确:
显示所有相同的图像:
相关代码:
override func viewDidLoad()
super.viewDidLoad()
// Do any additional setup after loading the view.
self.navigationController?.navigationBar.isHidden = false
AddImages()
ListFolders()
func ListFolders()
do
let filemgr = FileManager.default
let filelist = try filemgr.contentsOfDirectory(atPath: BaseFolder + "/Edussentials/Home/" + MyFolder)
for file in filelist
if (MyFunctions().mid(file,0,4) == "BUT_") || (MyFunctions().mid(file,0,4) == "IBT_")
IncreaseMyArrays()
MyButton_Name[ButtonCount] = MyFunctions().mid(file, 4, 50)
MyButton_Type[ButtonCount] = MyFunctions().mid(file, 0, 4)
ReadButtons(ButtonFolder: BaseFolder + "/Edussentials/Home/" + MyFolder + "/" + file)
ButtonCount += 1
CreateIButtons()
CreateButtons()
catch let error
print("Error: \(error.localizedDescription)")
func CreateIButtons()
var i: Int = 0
repeat
if (MyButton_Type[i] == "IBT_")
let button = UIButton(frame: CGRect(x: Int(MyDisplayWidth / 100 * Float(MyButton_xPos[i])), y: Int(MyDisplayHeight / 100 * Float(MyButton_yPos[i] + MySetFromTop)), width: Int(MyDisplayWidth / 100 * Float(MyButton_Width[i])), height: Int(MyDisplayHeight / 100 * Float(MyButton_Height[i]))))
let imageURL = URL(fileURLWithPath: BaseFolder + "/Edussentials/Home/" + MyFolder + "/IBT_" + MyButton_Name[i] + "/MyImage.gif")
let MyImage = UIImage(named: imageURL.path)!
button.setImage(MyImage, for: UIControlState.normal)
button.tag = i
button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
self.view.addSubview(button)
i += 1
while i < ButtonCount
【问题讨论】:
您在视图控制器中的什么地方使用此代码? 在视图控制器中从 viewDidLoad 调用的函数中 请在let MyImage = UIImage(named: imageURL.path)!
这行之前添加这个语句print(imageURL)
,看看当你再次打开视图时它会打印不同的url吗?
我在用作背景的图像上遇到了同样的问题。代码在同一个视图控制器内。//设置背景 let imagebg = UIImageView(frame: CGRect(x: Int(MyDisplayWidth / 100 * Float(0)), y: Int(MyDisplayHeight / 100 * Float(MySetFromTop)),宽度:Int(MyDisplayWidth / 100 * Float(100)),高度:Int(MyDisplayHeight / 100 * Float(100)))) 让 imageURLbg = URL(fileURLWithPath: BaseFolder + "/Edussentials/Home/" + MyFolder + "/ background.jpg") imagebg.image = UIImage(named: imageURLbg.path) self.view.addSubview(imagebg)
我确实尝试过,它确实使用了不同的 URL
【参考方案1】:
正如您所说,您在应用中多次重复使用该视图。在这里,您已将 if
用于自定义视图,但忘记实现 else
以使该视图变为原始状态。
在每个if
之后使用else
将您的代码置于默认状态。
【讨论】:
【参考方案2】:指向图像的正确方法是使用 UIImage(contentsOfFile: "MyFullPath") 而不是 UIImage(named: "MyFullPath") 问题是我所有的图像都具有相同的名称但位于不同的目录中。出于某种原因,UIImage 在第一次调用视图时得到了正确的图像。然而,第二次调用视图时,它指向最后找到的目录,因此在每个按钮上显示相同的图像。
button.setImage(UIImage(contentsOfFile: BaseFolder + "/Edussentials/Home/" + MyFolder + "/IBT_" + MyButton_Name[i] + "/MyImage.gif"), for: UIControlState.normal)
【讨论】:
以上是关于视图控制器仅在第一次正确加载图像的主要内容,如果未能解决你的问题,请参考以下文章
Primefaces graphicsImage仅在第一次加载时显示图像[重复]
为啥我的 TabBar 按钮在我第一次加载视图控制器时被禁用?