如何在自定义类中多次使用函数

时间:2017-03-30 23:50:02

标签: ios function swift3 xcode8

无论如何都要实现

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {} 

两次?我正在尝试创建一个包含多个视图控制器的转换应用程序,其中所有视图控制器都具有相似的UITextFields。我在www.globalnerdy.com上关注了一个很棒的教程,该教程展示了如何创建一个限制字符的自定义类,并且只允许给定文本字段中的某些字符。代码完成后,您可以在“属性”检查器中修改视图控制器内的属性。以下是我创建的MaxLengthTextField自定义类。

class MaxLengthTextField: UITextField, UITextFieldDelegate {

private var characterLimit: Int?

required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)

    delegate = self

}

@IBInspectable var maxLength: Int {

    get {

        guard let length = characterLimit else {

            return Int.max

        }

        return length

    }

    set {

        characterLimit = newValue

    }

}

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    guard string.characters.count > 0 else {

        return true

    }

    let currentText = textField.text ?? ""

    let prospectiveText = (currentText as NSString).replacingCharacters(in: range, with: string)


    return allowedIntoTextField(text: prospectiveText)


}

func allowedIntoTextField(text: String) -> Bool {

    return text.characters.count <= maxLength

}

}

这是AllowedCharacters自定义类,MaxLengthTextField的子类。

class AllowedCharsTextField: MaxLengthTextField {

@IBInspectable var allowedChars: String = ""

required init?(coder aDecoder: NSCoder) {

    super.init(coder: aDecoder)

    delegate = self

    autocorrectionType = .no

}

override func allowedIntoTextField(text: String) -> Bool {

    return super.allowedIntoTextField(text: text) && text.containsOnlyCharactersIn(matchCharacters: allowedChars)

}

}

private extension String {

// Returns true if the string contains only characters found in mainCharacters.
func containsOnlyCharactersIn(matchCharacters: String) -> Bool {

    let disallowedCharacterSet = CharacterSet(charactersIn: matchCharacters).inverted

    return self.rangeOfCharacter(from: disallowedCharacterSet) == nil

}
}

我遇到的问题是限制小数“。”在我的代码中。我已经尝试使用我在Stack Overflow上找到的代码两次实现func textField(_ textField: UITextField, shouldChangeCharactersIn...函数(用于限制小数),但由于特定的文本字段已经是一个限制字符的自定义类,我无法制作文本字段是视图控制器的委托,同时限制“点”。

非常感谢任何指导,参考和直接帮助!

1 个答案:

答案 0 :(得分:0)

在您的代码中,方法由其签名唯一标识 - 或方法名称加上参数(参数类型)的组合。因此,您不能在代码中使用两次完全相同的方法。这将导致编译器错误。

不是两次实现textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {}方法,而应该看看传入的textField参数,以确定首先发送委托方法的文本字段。

将视图控制器设为UITextFieldDelegate,然后在视图控制器中为您的不同文本字段设置插座。因此,如果您的文字字段为text1text2,那么您的委托方法将如下所示:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if textField == text1 {
        // Handle text1 code
    } else if textField == text2 {
        // Handle text2 code
    }
}

希望上述内容对您有意义,但如果没有,请随时要求澄清:)