微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

实例成员 '....' 不能用于类型 'CustomTextField';你的意思是要使用这种类型的值吗? 附录

如何解决实例成员 '....' 不能用于类型 'CustomTextField';你的意思是要使用这种类型的值吗? 附录

我想从 ViewController 更改 CustomTextField 类中的“leftIcon”变量。 但是,我在 CustomTextField 类中收到以下错误

自定义文本字段

class CustomTextField: UITextField,UITextFieldDelegate {
    //"person"
    private var showPassword: Bool = false
    var leftIcon: String = ""
    
    private let leftIconView: UIImageView = {
        let icon = UIImage(systemName: leftIcon)
        let imageView = UIImageView(image: icon)
        imageView.contentMode = .scaleAspectFit
        imageView.tintColor = .white
        return imageView
    }()
}

错误

Instance member 'leftIcon' cannot be used on type 'CustomTextField'; did you mean to use a value of this type instead?

视图控制器

class ViewController: UIViewController {
    
    var textfield = CustomTextField()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.textfield.leftIcon = "person"
    }
}

解决方法

我稍微提炼了问题并重新创建了它,因此您需要重新添加我删除的代码。此代码产生相同的错误:

class CustomTextField {
    var leftIcon: String = ""
    
    private let leftIconView: UIImageView = {
        let icon = UIImage(systemName: leftIcon) // <--- Error here
        let imageView = UIImageView(image: icon)
        return imageView
    }()
}

并找到问题所在。

问题在于,在调用初始化程序之前,初始化 leftIconView 实际上发生在 static 上下文中,因此您无法引用实例属性。我找到了两个简单的解决方案,第一个是使 leftIconView 成为 lazy var 而不是 let

class CustomTextField {
    var leftIcon: String = ""
    
    private lazy var leftIconView: UIImageView = {
        let icon = UIImage(systemName: leftIcon)
        let imageView = UIImageView(image: icon)
        return imageView
    }()
}

第二种解决方案是在初始化程序中初始化 leftIconView

class CustomTextField {
    var leftIcon: String = ""
    
    private let leftIconView: UIImageView
    
    override init()
    {
        let icon = UIImage(systemName: leftIcon)
        self.leftIconView = UIImageView(image: icon)
    }
}

第二种解决方案可能需要您在添加回继承后还为 UIView 实现一些其他初始化程序,当然您需要在初始化程序的末尾调用 super.init

附录

上述解决方案确实修复了编译错误,但实际上使用 CustomTextField 上的属性观察器使图标出现在所需的 leftIcon

class CustomTextField: UITextField,UITextFieldDelegate {
    //"person"
    private var showPassword: Bool = false
    var leftIcon: String = ""
    {
        didSet
        {
            leftIconView = makeImageView(for: leftIcon)

            // leftView is the view that is actually displayed.  It's set
            // once in the initializer,so now that we're updating 
            // leftIconView,we have to update leftView as well
            leftView = leftIconView
            
            // Maybe also do this
            leftView?.setNeedsDisplay()
        }
    }
    
    private lazy var leftIconView: UIImageView = {
        makeImageView(for: leftIcon)
    }()
    
    private func makeImageView(for imageName: String) -> UIImageView {
        let icon = UIImage(systemName: imageName )
        let imageView = UIImageView(image: icon)
        imageView.contentMode = .scaleAspectFit
        imageView.tintColor = .white
        return imageView
    }
    
    ...
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。