ปรับปรุง:
คำถามของฉันมี 2 ส่วน:
- วิธีสร้างลิงก์ที่ข้อความที่แสดงสำหรับลิงค์ที่คลิกได้นั้นแตกต่างจากลิงค์จริงที่ถูกเรียกใช้:
- วิธีตั้งค่าลิงค์โดยไม่ต้องใช้รหัสที่กำหนดเองเพื่อตั้งค่าคุณสมบัติในข้อความ
ปรากฎว่า iOS 7 เพิ่มความสามารถในการโหลดข้อความประกอบจาก NSData
เพิ่มความสามารถในการโหลดข้อความประกอบจาก
ฉันสร้างคลาสย่อยที่กำหนดเองUITextView
ซึ่งใช้ประโยชน์จาก@IBInspectable
แอตทริบิวต์และให้คุณโหลดเนื้อหาจากไฟล์ RTF โดยตรงใน IB คุณเพียงแค่พิมพ์ชื่อไฟล์ลงใน IB และคลาสที่กำหนดเองทำส่วนที่เหลือ
นี่คือรายละเอียด:
ใน iOS 7 ได้รับวิธีการที่NSAttributedString
initWithData:options:documentAttributes:error:
วิธีการดังกล่าวช่วยให้คุณโหลด NSAttributedString จากวัตถุ NSData คุณสามารถโหลดไฟล์ RTF ลงใน NSData ก่อนจากนั้นใช้initWithData:options:documentAttributes:error:
เพื่อโหลด NSData นั้นลงในมุมมองข้อความของคุณ (โปรดทราบว่ายังมีวิธีinitWithFileURL:options:documentAttributes:error:
ที่จะโหลดสตริงที่เชื่อมโยงโดยตรงจากไฟล์ แต่วิธีการนั้นเลิกใช้แล้วใน iOS 9 มันปลอดภัยกว่าที่จะใช้วิธีinitWithData:options:documentAttributes:error:
ที่ไม่ได้คัดค้าน
ฉันต้องการวิธีที่ให้ฉันติดตั้งลิงก์แบบคลิกได้ในมุมมองข้อความโดยไม่ต้องสร้างรหัสใด ๆ กับลิงก์ที่ฉันใช้
วิธีการแก้ปัญหาที่ฉันมาด้วยคือการสร้าง subclass กำหนดเองของ UITextView ฉันโทรRTF_UITextView
และให้มันคุณสมบัติที่เรียกว่า@IBInspectable
RTF_Filename
กำลังเพิ่ม@IBInspectable
คุณสมบัติให้กับคุณสมบัติทำให้ตัวสร้างส่วนต่อประสานแสดงคุณสมบัติดังกล่าวใน "แอททริบิวผู้ตรวจสอบ" จากนั้นคุณสามารถตั้งค่านั้นจากรหัสที่กำหนดเองโดย IB
ฉันยังเพิ่ม@IBDesignable
คุณสมบัติให้กับคลาสที่กำหนดเองของฉัน @IBDesignable
แอตทริบิวต์บอก Xcode ว่ามันควรจะติดตั้งสำเนาการทำงานของระดับมุมมองที่กำหนดเองของคุณลงในการสร้างการเชื่อมต่อเพื่อให้คุณสามารถเห็นมันในการแสดงผลกราฟิกของลำดับชั้นมุมมองของคุณ () น่าเสียดายสำหรับคลาสนี้@IBDesignable
คุณสมบัติดูเหมือนจะไม่สม่ำเสมอ ใช้งานได้เมื่อฉันเพิ่มครั้งแรก แต่จากนั้นฉันลบเนื้อหาข้อความล้วนของมุมมองข้อความและลิงก์ที่คลิกได้ในมุมมองของฉันหายไปและฉันไม่สามารถนำกลับคืนมาได้)
รหัสสำหรับฉันนั้นRTF_UITextView
ง่ายมาก นอกเหนือจากการเพิ่มแอ@IBDesignable
ททริบิวและRTF_Filename
คุณสมบัติที่มีแอ@IBInspectable
ททริบิวต์แล้วฉันยังเพิ่มdidSet()
วิธีในRTF_Filename
คุณสมบัติ didSet()
วิธีการได้รับเรียกว่าเวลาใด ๆ ค่าของRTF_Filename
การเปลี่ยนแปลงสถานที่ให้บริการ รหัสสำหรับdidSet()
วิธีการค่อนข้างง่าย:
@IBDesignable
class RTF_UITextView: UITextView
{
@IBInspectable
var RTF_Filename: String?
{
didSet(newValue)
{
//If the RTF_Filename is nil or the empty string, don't do anything
if ((RTF_Filename ?? "").isEmpty)
{
return
}
//Use optional binding to try to get an URL to the
//specified filename in the app bundle. If that succeeds, try to load
//NSData from the file.
if let fileURL = NSBundle.mainBundle().URLForResource(RTF_Filename, withExtension: "rtf"),
//If the fileURL loads, also try to load NSData from the URL.
let theData = NSData(contentsOfURL: fileURL)
{
var aString:NSAttributedString
do
{
//Try to load an NSAttributedString from the data
try
aString = NSAttributedString(data: theData,
options: [:],
documentAttributes: nil
)
//If it succeeds, install the attributed string into the field.
self.attributedText = aString;
}
catch
{
print("Nerp.");
}
}
}
}
}
โปรดทราบว่าหากคุณสมบัติ @IBDesignable ไม่น่าเชื่อถือจะช่วยให้คุณดูตัวอย่างข้อความสไตล์ของคุณในเครื่องมือสร้างอินเตอร์เฟสคุณควรตั้งรหัสข้างต้นเป็นส่วนขยายของ UITextView แทนที่จะเป็นคลาสย่อยที่กำหนดเอง ด้วยวิธีนี้คุณสามารถใช้มันในมุมมองข้อความใดก็ได้โดยไม่ต้องเปลี่ยนมุมมองข้อความเป็นคลาสที่กำหนดเอง
ดูคำตอบอื่น ๆ ของฉันหากคุณต้องการสนับสนุน iOS เวอร์ชันก่อน iOS 7
คุณสามารถดาวน์โหลดตัวอย่างโครงการที่มีคลาสใหม่นี้จาก gitHub:
โครงการสาธิต DatesInSwiftบน Github