视图控制器仅在第一次正确加载图像

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 按钮在我第一次加载视图控制器时被禁用?

从 UITableView 加载 UIWebView 仅第一次有效

如何仅在第一次启动时打开视图控制器

如何使视图控制器仅在用户第一次快速打开应用程序时出现

如何仅在应用程序第一次运行时在我的 iOS 应用程序中打开页面视图控制器?