SWIFT - 将字符串转换为 UIKit 元素

Posted

技术标签:

【中文标题】SWIFT - 将字符串转换为 UIKit 元素【英文标题】:SWIFT - Convert String to UIKit element 【发布时间】:2017-05-04 21:16:50 【问题描述】:

也许这是一个尴尬的问题,但可以将 String 转换为 UIKit 元素。我的意思是:

我有以下 UIViewController

import UIKit

class BlurVC: UIViewController 


    let bg: UIImageView = 
       let image = UIImageView()
        image.image = #imageLiteral(resourceName: "IMG_9293")
        image.contentMode = .scaleAspectFill
        image.backgroundColor = .red
        return image
    ()

    let blurView: UIVisualEffectView = 
        let view = UIVisualEffectView(effect: UIBlurEffect(style: .dark))
        return view
    ()

    override func viewDidLoad() 
        super.viewDidLoad()



        bg.frame = view.bounds
        view.addSubview(bg)
        blurView.frame = bg.bounds
        bg.addSubview(blurView)

        setBlurButton()
    

    func setBlurButton() 

        let blurEffects = ["extraLight", "light", "dark"]

        for index in 0..<blurEffects.count

            let button = UIButton()
            button.setTitle(blurEffects[index], for: .normal)
            button.addTarget(self, action: #selector(setBlurEffect(_ :)), for: .touchUpInside)
            button.frame = CGRect(x: 10, y: 10  + index * 30, width: 100, height: 30)
            view.addSubview(button)
        
    

    func setBlurEffect(_ sender: UIButton)
        print(sender.titleLabel?.text)
        if let blurEffect = sender.titleLabel?.text 
            blurView.effect = UIBlurEffect(style: ".\(blurEffect)")
        
    

我用 3 个 UIBlurEffectStyle 参数的标题动态创建了 3 个按钮。

接下来我想根据标题标签设置 UIBlurEffectStyle 的值。

当然,xCode 警告我它不能将字符串转换为 UIBlurEffectStyle。

我可以将此字符串转换为 UIBlurEffectStyle 吗?如果是,怎么做?

谢谢。

【问题讨论】:

【参考方案1】:

UIBlurEffectStyle 基于 Int,因此不会自动从 String 转换。

但您可以手动完成。这是一个带有 init 的扩展,它将 UIBlurEffectStyle 案例作为 Strings:

extension UIBlurEffectStyle 

    init?(with string: String) 
        switch string 
        case "extraLight":
            self = .extraLight
        case "light":
            self = .light
        case "dark":
            self = .dark
        case "regular":
            self = .regular
        case "prominent":
            self = .prominent
        default:
            return nil
        
    

这不是一个容易出错的初始化器。由于它是字符串类型的,因此您需要在使用它之前验证它是否有效。

【讨论】:

Plus 1 但不适用于 ios 9.x。您需要添加一些@available 检查。 你是对的@OzgurVatansever,最后两种情况应该被注释掉或在 iOS 10 之前的版本中正确处理。我不想加载整个项目,所以我只是使用游乐场:)【参考方案2】:

你可以添加一个扩展:

extension UIBlurEffectStyle 
    static func styleFromString(_ string: String) -> UIBlurEffectStyle 
        switch string 
        case "extraLight":
            return .extraLight
        case "light":
            return .light
        case "dark":
            return .dark
        default:
            return .regular /* NOTE: .regular is not available in < iOS 10 */
        
    

在您的情况下使用:

blurView.effect  = UIBlurEffect(style: UIBlurEffectStyle.styleFromString("blurEffect"))

【讨论】:

@PEEJWEEJ 好点。谢谢。将更新答案以供任何人阅读。 感谢这个问题,它也可以正常工作@janusbalatbat

以上是关于SWIFT - 将字符串转换为 UIKit 元素的主要内容,如果未能解决你的问题,请参考以下文章

将UILabel子类从Objective-C转换为Swift

Swift:将 SwiftUI 元素添加到 UIKit 项目:无法正确应用约束

如何将 Swift 数组转换为字符串?

在 Xcode 9 / Swift 4 中不再可以访问原生 UIKit 元素的子视图?

如何在 Swift 中使用 UIKit 注册多个按钮点击?

SwiftUI/UIKit 如何将 SwiftUI 字体转换为 UIKit UIFont?