Способ определения слова в UITextView.text и изменения слова с префиксом с использованием Swift 2.2, iOS 9.3 и Xcode 7?

Используя TextView для ввода сообщений пользователя, его можно редактировать и выбирать во время редактирования пользователем. Одна из кнопок под полем переключает TextView между режимом редактирования и хэширования. При переключении на тег TextView отключает редактируемые и выбираемые свойства, и у меня есть функция для обнаружения нажатий и возврата положения символа в тексте.

Мне нужно определить слово, если оно есть, нажать и изменить слово в UITextView.text, добавив к нему префикс #, если у него уже нет двух хэшей, в этом случае он удаляет хэши. Я использую регулярные выражения для логики.

Я не смог найти высокоуровневый метод для определения слова персонажа, которого коснулись. Я искал через Dev Apple. Lib. и такие сайты, как raywenderlich и Grok Swift, но не могу найти метод, который, я уверен, должен быть там.

Я мог бы реализовать, проверяя, является ли текущий символ действительным делителем слов, если нет, то уменьшать индекс символа и проверять, пока не будет определена граница слова. В этот момент я возвращаюсь к предыдущему индексу и проверяю символ #, в случае, если это #, я проверяю следующий символ, а в случае, если это не #, я добавляю символ # в начало слова.

Есть ли функция в UIKit, TextKit или метод UITextView или NSTextStorage, который будет возвращать слово повернутого символа и NSRange этого слова? Кроме того, что будет правильным методом для добавления # к тексту TextView? [textView:shouldChangeTextInRange:replaceText или textView.textStorage:replaceCharactersInRange:withString:]

Я работал в коммерческих целях на ПК, PlayStation и GameBoy, но это первый раз, когда я разрабатываю приложение и использую платформу iPhone/Mac, поэтому я действительно мог бы воспользоваться советом.

2 ответа

Для определения # нужно вызвать код внутри делегата shouldChangeCharactersInRange

    let stringprocess = stringfordetecting.text
     let tok =  stringprocess!.componentsSeparatedByString(" ")
    for item in tok

    {
        let demo = String(item)

        if demo.hasPrefix("#") 
        {

        let range = (stringfordetecting.text! as NSString).rangeOfString(item)

        //add code

        }

        else
        {
         //add code    
        }

для обнаружения индексированного указателя символов добавьте гостевую строку в текстовое представление

let tapGesture = UITapGestureRecognizer(target: self, action: "textTapped:")
    tapGesture.headline = indexPath
    tapGesture.numberOfTapsRequired = 1
    textview2.addGestureRecognizer(tapGesture)


func textTapped(recognizer: MyTapGestureRecognizer){

    let textView: UITextView = recognizer.view as! UITextView
    var layoutManager: NSLayoutManager = textView.layoutManager
    var location: CGPoint = recognizer.locationInView(textView)
    let position: CGPoint = CGPointMake(location.x, location.y)
    location.x -= textview2.textContainerInset.left
    location.y -= textview2.textContainerInset.top
    var charIndex: Int
    charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: textview2.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    if charIndex < textview2.textStorage.length
            {

        print(charIndex)
            }

}

Для обнаружения постукивающего символа в текстовом представлении внутри функции распознавания прикосновения

 func textTapped(recognizer: MyTapGestureRecognizer){

    let textView: UITextView = recognizer.view as! UITextView



    var layoutManager: NSLayoutManager = textView.layoutManager
    var location: CGPoint = recognizer.locationInView(textView)


    let position: CGPoint = CGPointMake(location.x, location.y)

location.x -= cell.messageLabel.textContainerInset.left
    location.y -= cell.messageLabel.textContainerInset.top

    var charIndex: Int
    charIndex = layoutManager.characterIndexForPoint(location, inTextContainer: cell.messageLabel.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)

    if charIndex < cell.messageLabel.textStorage.length {


        let stringprocess = textview.text


        let tok =  stringprocess.componentsSeparatedByString(" ")

       // let attributedString1 = NSMutableAttributedString(string:stringcheck as String)

        for item in tok

        {
            let demo = String(item)

            if demo.hasPrefix("@") {

                let range = (stringcheck as NSString).rangeOfString(item)



                var i = range.location
                while i <= range.location+range.length

                {
                    if i == charIndex

                    {
                        print(demo)

                }

                    i++

                }




            }



         }
        }
Другие вопросы по тегам