2016-02-22 5 views
1

Я использую следующий код, чтобы ограничить количество символов, которые могут быть в UITextFieldОграничение символов на UITextField ломает Emojis, можно добавить только один, а не удалять

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

     let currentCharacterCount = textField.text?.characters.count ?? 0 
     if (range.length + range.location > currentCharacterCount){ 
      return false 
     } 
     let newLength = currentCharacterCount + string.characters.count - range.length 
     return newLength <= 44 
    } 

Это делается путем установки UITextField-х делегировать до self.

-

Проблема здесь в том, что если добавить Emoji в текстовое поле, вы не можете удалить его. Даже если вы выделите - выберите все или используйте «вырезать», текст не изменится. Эможи может быть до или после текста или даже в текстовом поле. Вы также не можете добавить два emojis в поле.

Я не понимаю, в чем проблема, может ли кто-нибудь помочь мне?

+0

нужны разъяснения - 1. Сначала вы хотите ограничить один emoji в UItextfeild? 2. Вы пытаетесь удалить текст в textfeild, но emoji остается, но текст удаляется. Это правильно? – Vizllx

ответ

0

Его лучше, если вы не выполняете никаких проверок внутри функции shouldChange .. и вместо этого отслеживаете длину отдельно, используя уведомление UITextFieldTextDidChangeNotification. Пример кода приведен ниже. В shouldChange .. просто верните bool, который установлен в textDidChange. Здесь вы получите правильную длину. Я заметил, что в вашем методе, когда вы добавляете emoji, он даже не позволит вам вводить больше. Функция shouldChangeCharactersInRange даже не вызывается после ввода символа emoji.

class ViewController: UIViewController, UITextFieldDelegate{ 

    @IBOutlet weak var textField:UITextField! 
    var allow = true 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "textFieldDidChange:", name: UITextFieldTextDidChangeNotification, object: textField) 
     // Do any additional setup after loading the view, typically from a nib. 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
     return allow 
    } 

    func textFieldDidChange(notification:NSNotification) 
    { 
     let length = textField.text?.lengthOfBytesUsingEncoding(NSUTF8StringEncoding) 
     if length > 44 { 
      allow = false 
     } else { 
      allow = true 
     } 
    } 

} 
+0

Благодарим вас за это, хотя это помогает, но все равно удается повесить наугад. Иногда это может быть 2 или 3 emojis, иногда это может быть 4-5. Я понимаю, что emojis занимает 6 символов до предела, так что это не проблема. Та же проблема сохраняется, тогда как вы не можете добавлять текст или удалять что-либо, все текстовое поле просто становится мертвым. – Hobbyist

0

В Swift 3,1

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 
    let currentCharacterCount = textField.text?.characters.count ?? 0 
    let limit = 10 
    return currentCharacterCount < limit || string.characters.count < range.length 
} 

Это не помешает скопировать и вставить длинную строку текста, я отключил функцию вставки для UITextField с кодами от

https://stackoverflow.com/a/39015132/6311644