2017-01-10 1 views
0

В моем приложении я создал расширение для UILabel, который содержит следующий метод:как я могу сделать hashtags интерактивным в UILabel в Swift 3?

func formatTextInLabel() { 
    let text = self.text 
    let font = UIFont(name: fontName, size: 16.0) 
    let titleDict: NSDictionary = [NSFontAttributeName: font!] 
    // This will give me an attributedString with the desired font 
    let attributedString = NSMutableAttributedString(string: text!, attributes: titleDict as! [String : AnyObject]) 
    let regex = try? NSRegularExpression(pattern: "#(\\w+)", options: []) 
    let matches = regex!.matches(in: text!, options: [], range: NSMakeRange(0, text!.characters.count)) 
    for match in matches { 
     let matchRange = match.rangeAt(0) 

     let titleDict: NSDictionary = [NSForegroundColorAttributeName: orangeColor] 

     attributedString.addAttributes(titleDict as! [String : AnyObject], range: matchRange) 
    } 
    self.attributedText = attributedString 
} 

и выдвигает на первый план все #hashtags в моем выбранном цвете. Но они не доступны для просмотра, я нашел сообщение на SO, в котором говорится, что достичь невозможно: How to detect and make hyperlinks/mentions/hashtags clickable in UILabel?, но, похоже, он устарел (надеюсь). Можете ли вы дать мне подсказку, как я могу, например. отобразить в консоли имя выбранного хэштега?

Еще одна вещь, которую нужно добавить - я знаю некоторые pod, например ActiveLabel или аналогичные, но я пробовал их и имел проблемы с ограничениями в моем случае, поэтому я хочу добиться этого эффекта из своего собственного кода.

+0

обратитесь к [this] (https://github.com/optonaut/ActiveLabel.swift) для hashtag –

ответ

1

Попробуйте добавить UITapGestureRecognizer к метке:

let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:))) 
label.addGestureRecognizer(tap) 

func handleLabelTap(_ sender: UITapGestureRecognizer) { 

    // Do something here for when the user taps on the label 

} 

Для того, чтобы работать, вы, вероятно, придется установить isUserInteractionEnabled в true на для метки. Я просто сделал тест в Xcode, и он сработал. Итак:

label.isUserInteractionEnabled = true 

EDIT:

Если вы хотите, чтобы определить, какие хэштегом был прослушивается, в верхней части вашего объявления класса, прежде чем он инициализируется создавать свойства для пустого UILabel массива, и пустой UITapGestureRecognizer массив как это:

var labels:[UILabel] = [UILabel]() 
var labelTaps:[UITapGestureRecognizer] = [UITapGestureRecognizer]() 

Тогда при создании каждой этикетки добавить метку и нажмите жест каждого соответствующего массива

let label = UILabel() 
// Set all label properties as you wish 

// Make sure to add 
label.isUserInteractionEnabled = true 

// Create the tap gesture 
let tap = UITapGestureRecognizer(target: self, action: #selector(handleLabelTap(_:))) 
label.addGestureRecognizer(tap) 

labels.append(label) 
labelTaps.append(tap) 

Затем, когда пользователь нажимает на один из тэгов-хэшей, вы можете получить индекс, какой жест жеста был отправлен методу, а затем использовать его, чтобы выяснить, какая метка это потому, что он будет иметь одинаковый индекс в массиве 'labels', поскольку соответствующий признак распознавания жестов будет иметь в массиве labelTaps. Вот как это сделать:

func handleLabelTap(_ sender: UITapGestureRecognizer) { 

    if let index = labelTaps.index(of: sender) { 

     let tappedLabel:UILabel = labels[index] 

     // Now you can do whatever you want 
     print("User tapped label with hash-tag: \(tappedLabel.text)") 

    } 

} 
+0

hm ok, но как я могу различить, какой хэштег был использован? В моем случае может быть более одного хэштега в одном 'UILabel' – user3766930

+0

Сделать пустой массив' UILabel' и массив 'UITapGestureRecognizer', а затем, когда вы создадите каждую метку, добавьте ярлык и распознаватель жестов , Я отредактирую свой ответ, чтобы отразить что-то подобное. – Pierce

+0

@ user3766930 - см. Обновленный ответ – Pierce

0

Вы не можете сделать ссылки кликабельны в UILabel, но вы можете в UITextField или UITextView. Они позволяют добавлять интерактивные ссылки.

Если ссылка отображается в виде ссылки, например http://[email protected], тогда вы можете просто включить обнаружение ссылок. Если вы хотите, чтобы ссылка отображала произвольную строку типа «нажмите здесь» и сделайте эту строку кликабельной, вам нужно будет установить атрибутированную строку в текстовое поле/текстовое представление.

Какими типами ссылок являются эти и как вы хотите, чтобы это выглядело в тексте?

+0

Я сделал это, но проблема в том, что приложение вылетает, когда ссылки hashtag находятся на арабском языке. –

+0

Huh. Это должно работать, если вы создадите ссылку в коде.Другой вариант - создать RTF-файл, содержащий ссылку, и загрузить его в текстовое поле. –

+0

Это вопрос, который я задал недавно и не имел ответов по этому вопросу. Я был бы рад, если бы вы могли помочь. Благодарю. https://stackoverflow.com/questions/48012614/does-nsattributedstringkey-link-accept-arabic-characters-as-value –