Способ определения слова в 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++
}
}
}
}