การตรวจจับการแตะข้อความที่มาจากแหล่งข้อมูลด้วย Swift
บางครั้งสำหรับผู้เริ่มต้นมันยากที่จะรู้วิธีตั้งค่าสิ่งต่างๆ (สำหรับฉันแล้วล่ะ) ตัวอย่างนี้จึงค่อนข้างสมบูรณ์
เพิ่มUITextView
ในโครงการของคุณ
ทางออก
เชื่อมต่อUITextView
ไปยังมีเต้าเสียบที่มีชื่อว่าViewController
textView
แอตทริบิวต์ที่กำหนดเอง
เรากำลังจะทำให้แอตทริบิวต์ที่กำหนดเองโดยการขยาย
หมายเหตุ:ขั้นตอนนี้จะเป็นตัวเลือกในทางเทคนิค NSAttributedString.Key.foregroundColor
แต่ถ้าคุณไม่ทำเช่นนั้นคุณจะต้องแก้ไขโค้ดในส่วนต่อไปที่จะใช้แอตทริบิวต์มาตรฐานเช่น ข้อดีของการใช้แอตทริบิวต์ที่กำหนดเองคือคุณสามารถกำหนดค่าที่คุณต้องการจัดเก็บในช่วงข้อความที่มีการระบุแหล่งที่มา
เพิ่มไฟล์ที่รวดเร็วใหม่ที่มีไฟล์> ใหม่> File ... > iOS> แหล่งที่มา> สวิฟท์ไฟล์ คุณสามารถเรียกมันว่าสิ่งที่คุณต้องการ ฉันกำลังเรียกNSAttributedStringKey + CustomAttribute.swift ของฉัน
วางรหัสต่อไปนี้:
import Foundation
extension NSAttributedString.Key {
static let myAttributeName = NSAttributedString.Key(rawValue: "MyCustomAttribute")
}
รหัส
แทนที่รหัสใน ViewController.swift ดังต่อไปนี้ หมายเหตุUIGestureRecognizerDelegate
.
import UIKit
class ViewController: UIViewController, UIGestureRecognizerDelegate {
@IBOutlet weak var textView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
// Create an attributed string
let myString = NSMutableAttributedString(string: "Swift attributed text")
// Set an attribute on part of the string
let myRange = NSRange(location: 0, length: 5) // range of "Swift"
let myCustomAttribute = [ NSAttributedString.Key.myAttributeName: "some value"]
myString.addAttributes(myCustomAttribute, range: myRange)
textView.attributedText = myString
// Add tap gesture recognizer to Text View
let tap = UITapGestureRecognizer(target: self, action: #selector(myMethodToHandleTap(_:)))
tap.delegate = self
textView.addGestureRecognizer(tap)
}
@objc func myMethodToHandleTap(_ sender: UITapGestureRecognizer) {
let myTextView = sender.view as! UITextView
let layoutManager = myTextView.layoutManager
// location of tap in myTextView coordinates and taking the inset into account
var location = sender.location(in: myTextView)
location.x -= myTextView.textContainerInset.left;
location.y -= myTextView.textContainerInset.top;
// character index at tap location
let characterIndex = layoutManager.characterIndex(for: location, in: myTextView.textContainer, fractionOfDistanceBetweenInsertionPoints: nil)
// if index is valid then do something.
if characterIndex < myTextView.textStorage.length {
// print the character index
print("character index: \(characterIndex)")
// print the character at the index
let myRange = NSRange(location: characterIndex, length: 1)
let substring = (myTextView.attributedText.string as NSString).substring(with: myRange)
print("character at index: \(substring)")
// check if the tap location has a certain attribute
let attributeName = NSAttributedString.Key.myAttributeName
let attributeValue = myTextView.attributedText?.attribute(attributeName, at: characterIndex, effectiveRange: nil)
if let value = attributeValue {
print("You tapped on \(attributeName.rawValue) and the value is: \(value)")
}
}
}
}
ตอนนี้ถ้าคุณแตะที่ "w" ของ "Swift" คุณจะได้รับผลลัพธ์ดังต่อไปนี้:
character index: 1
character at index: w
You tapped on MyCustomAttribute and the value is: some value
หมายเหตุ
- ที่นี่ฉันใช้แอตทริบิวต์ที่กำหนดเอง แต่อาจมี
NSAttributedString.Key.foregroundColor
(สีข้อความ) ที่มีค่าเป็นUIColor.green
.
- เดิมมุมมองข้อความไม่สามารถแก้ไขหรือเลือกได้ แต่ในคำตอบที่อัปเดตของฉันสำหรับ Swift 4.2 ดูเหมือนว่าจะทำงานได้ดีไม่ว่าจะเลือกสิ่งเหล่านี้หรือไม่ก็ตาม
ศึกษาเพิ่มเติม
คำตอบนี้มาจากคำตอบอื่น ๆ สำหรับคำถามนี้ นอกจากนี้ให้ดูด้วย