【问题标题】:Instance member '....' cannot be used on type 'CustomTextField'; did you mean to use a value of this type instead?实例成员“....”不能用于类型“CustomTextField”;你的意思是使用这种类型的值吗?
【发布时间】:2021-06-29 12:37:50
【问题描述】:

我想从 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"
    }
}

【问题讨论】:

  • 对不起,我删除了我的答案,因为它不可能是正确的。我不确定发生了什么,但我会考虑一下。如果在您的ViewController 中,行设置textfieldvar textfield = CustomTextField,而不调用初始化程序,但您正在调用它,那么该错误将是有意义的,所以除非有一些其他相关的错误,否则这是一个谜对我来说。
  • 那么是let icon = UIImage(systemName: leftIcon) 上发生的错误吗?
  • @ChipJarred 是的
  • 对不起,如果您在我疯狂编辑时尝试阅读我的答案。我得到了在 Xcode 中工作的提炼代码,所以我认为当你添加我删除的代码时它会解决你的问题。
  • 我尝试了这两种解决方案,但我无法从 viewDidLoad 更改 CustomTextField 中的 leftIcon 值。 @ChipJarred

标签: ios swift uitextfield programmatically-created programmatically


【解决方案1】:

替代解决方案

对于像你这样的情况,我们也可以使用静态变量。

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

它更简洁、更短。除了这个调用语句:

CustomTextField.leftIcon

【讨论】:

    【解决方案2】:

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

    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

    附录

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

    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
        }
        
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多