Swift 3 扩展返回 "has no member" 错误

Swift 3 extension returning "has no member" error

我创建了一个名为 UnderlinedUITextField 的扩展。我试图在另一个 class 的 UITextField 上调用它的唯一函数 带下划线 ,但我收到错误 Value of type 'UITextField'没有成员 'underlined.'

我遵循了一个在网上找到的示例,它非常适合他们。我不确定为什么会收到此错误。

UnderlinedUITextField 扩展

import UIKit

extension UnderlinedUITextField {

func underlined() {

    let border = CALayer()
    let width = CGFloat(1.0)
    border.borderColor = UIColor.lightGray.cgColor
    border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)
    border.borderWidth = width
    self.layer.addSublayer(border)
    self.layer.masksToBounds = true
}
}

HomeScreenVC

import UIKit

class HomeScreenVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

override func viewDidLoad() {
    super.viewDidLoad()

    titleOfArticleTextField.underlined() <- WHERE I GET THE ERROR MESSAGE

}

//MARK: Properties

@IBOutlet weak var titleOfArticleTextField: UITextField!
@IBOutlet weak var authorTextField: UITextField!
@IBOutlet weak var bulletPointTextField: UITextField!
@IBOutlet weak var previewOfImage: UIImageView!
@IBOutlet weak var uploadImage: UIButton!

您的扩展应该是 UITextField 而不是 UnderlinedUITextField 您想要扩展现有的 class 以获得新方法。

你的titleOfArticleTextField是一个普通的UITextField所以它不知道你在UnderlinedUITextField

中添加了一个叫做underlined的函数

尝试更改您的扩展名,使其改为扩展 UITextField

extension UITextField {

    func underlined() {
        let border = CALayer()
        let width = CGFloat(1.0)
        border.borderColor = UIColor.lightGray.cgColor
        border.frame = CGRect(x: 0, y: self.frame.size.height - width, width:  self.frame.size.width, height: self.frame.size.height)
        border.borderWidth = width
        self.layer.addSublayer(border)
        self.layer.masksToBounds = true
    }
}

希望对您有所帮助。

看起来UnderlinedUITextField是使用UITextField扩展的控件,所以我猜测变量titleOfArticleTextField的类型应该是UnderlinedUITextField而不是[=12] =]:

@IBOutlet weak var titleOfArticleTextField: UnderlinedUITextField!  // <-- Check type here

这应该可以修复错误,并找到方法。

由于您的扩展是为 UnderlinedUITextField 定义的,使用这种方式您可以安全地将下划线函数调用到类型为 UnderlinedUITextField 的文本字段,并且它不适用于类型 UITextField类型。

您的扩展名必须是 UITextField.

因为顾名思义,扩展扩展了特定 class 的功能。现在,如果您想为 UITextField 添加更多功能 class,那么您必须创建一个名称为 UITextField 的扩展。