Swift4-意外找到nil-将图像设置为按钮

时间:2018-10-07 12:19:57

标签: swift image button

大家好,我想参加一个帮助课程,该课程将所有图片设置为按钮。但是图片总是零:(我的错误在哪里?

第1类(发生动作的地方)

class RandomClass {
    let imageSetter = ImageSetter()
    let mvc = MainViewController()

    func actionWhenConnected(){
    imageSetter.setButtonImages(nameOfButton: mvc.ConnectingButtonLabel, nameOfImage: "Connection/ConnectionOn", nameOfColor: .green, forStatus: .normal)
    }
}

这意味着调用该函数时,MainViewController中的图像应切换为绿色的“图片连接”

第2类(助手类)

class ImageSetter{

func setButtonImages(nameOfButton:UIButton, nameOfImage:String, nameOfColor:UIColor, forStatus:UIControl.State){
    nameOfButton.setImage(UIImage(named: nameOfImage), for: forStatus)
    let origImage = UIImage(named: nameOfImage)
    let tintedImage = origImage?.withRenderingMode(.alwaysTemplate)
    nameOfButton.setImage(tintedImage, for: .normal)
    nameOfButton.tintColor = nameOfColor
    }

}

Assets

在我的MainViewController中,它可以工作:( 似乎RandomClass无法访问asset.xcassets,因为它找不到图像的名称?

已解决!

    func actionWhenConnected(){
    let mvc = UIApplication.shared.keyWindow?.rootViewController as! MainViewController
    imageSetter.setButtonImages(nameOfButton:mvc.ConnectingButtonLabel, nameOfImage: "Connection/ConnectionOff", nameOfColor: .red, forStatus: .normal)
}

非常感谢@matt

1 个答案:

答案 0 :(得分:-1)

问题是这一行:

func capitalize(string: String, positions: IndexSet) -> String {

    guard string.count > 0 else {
        fatalError("There is nothing to capitalize")
    }

    let zeroBasedPositions = positions.map {$0 - 1}

    guard zeroBasedPositions.allSatisfy({ $0 >= 0 }) else {
        fatalError("The positions should be one-based")
    }

    let letterIndexes = string
        .enumerated()
        .filter { (index, char) in
            CharacterSet(charactersIn: String(char))
                .isSubset(of: CharacterSet.letters)
        }.map { $0.0 }

    guard let positionsMax = zeroBasedPositions.max(),
        positionsMax <= letterIndexes.count
        else {
            fatalError("There are only \(letterIndexes.count) letters")
    }

    let lettersToCapitalizeIndexes = zeroBasedPositions.map { letterIndexes[$0] }

    return String(string.enumerated().map{ (index, char) in
        if lettersToCapitalizeIndexes.contains(index) {
            return String(char).capitalized.first!
        } else {
            return char
        }
    })
}

var str = "there are 12 months in a year"
capitalize(string: str, positions: [4, 6])  //"theRe Are 12 months in a year"

考虑一下短语let mvc = MainViewController() 的作用!它创建一个新的MainViewController单独的第二个实例。因此,视图永远不会从情节提要中加载,也不会钩住按钮的插座,从而导致崩溃。

您想要的是对实际MainViewController实例的引用,该实例的视图已存在于您的接口中。那就是带有您可以看到的按钮的那个。

  

在我的MainViewController中有效

是的,因为在MainViewController中您知道如何获取对此实例的引用-您只需说MainViewController()。但是,即使您说self,即使在那也行不通。

  

似乎RandomClass无法访问asset.xcassets,因为它找不到图像的名称?

是的。它找到图像。没有什么是 button