簡體   English   中英

如何在自定義類中多次使用函數

[英]How to use functions more than once in a Custom Class

無論如何有實施

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...函數兩次,但是由於特定的文本字段已經是一個自定義類,因此限制了小數位數字符,我無法使文本字段成為視圖控制器的委托並同時限制“點”。

任何指導,參考和直接幫助將不勝感激!

在您的代碼中,方法通過其簽名(或方法名稱加上所需的參數(參數的類型)的組合)唯一標識。 因此,您的代碼中不能兩次使用完全相同的方法。 這將導致編譯器錯誤。

而不是實現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
    }
}

希望以上內容對您有意義,但如果沒有,請隨時進行澄清:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM