Cập nhật:
Có 2 phần chính cho câu hỏi của tôi:
- Cách tạo liên kết trong đó văn bản hiển thị cho liên kết có thể nhấp khác với liên kết thực tế được gọi:
- Cách thiết lập các liên kết mà không phải sử dụng mã tùy chỉnh để đặt các thuộc tính trên văn bản.
Hóa ra iOS 7 đã thêm khả năng tải văn bản được quy cho NSData
.
Tôi đã tạo một lớp con tùy chỉnh UITextView
để tận dụng lợi thế của@IBInspectable
thuộc tính và cho phép bạn tải nội dung từ tệp RTF trực tiếp trong IB. Bạn chỉ cần nhập tên tệp vào IB và lớp tùy chỉnh thực hiện phần còn lại.
Đây là những thông tin chi tiết:
Trong iOS 7, NSAttributedString
đã đạt được phương pháp initWithData:options:documentAttributes:error:
. Phương pháp đó cho phép bạn tải NSAttributionString từ một đối tượng NSData. Trước tiên, bạn có thể tải tệp RTF vào NSData, sau đó sử dụng initWithData:options:documentAttributes:error:
để tải NSData đó vào chế độ xem văn bản của bạn. (Lưu ý rằng cũng có một phương thức initWithFileURL:options:documentAttributes:error:
sẽ tải một chuỗi được gán trực tiếp từ một tệp, nhưng phương thức đó không được dùng trong iOS 9. An toàn hơn khi sử dụng phương thức initWithData:options:documentAttributes:error:
không bị phản đối.
Tôi muốn một phương thức cho phép tôi cài đặt các liên kết có thể nhấp vào chế độ xem văn bản của mình mà không phải tạo bất kỳ mã cụ thể nào cho các liên kết tôi đang sử dụng.
Giải pháp tôi đưa ra là tạo một lớp con tùy chỉnh của UITextView mà tôi gọi RTF_UITextView
và cung cấp cho nó một thuộc @IBInspectable
tính được gọi RTF_Filename
. Thêm@IBInspectable
thuộc tính vào thuộc tính sẽ khiến Trình tạo giao diện hiển thị thuộc tính đó trong "Trình theo dõi thuộc tính". Sau đó, bạn có thể đặt giá trị đó từ mã tùy chỉnh IB.
Tôi cũng đã thêm một @IBDesignable
thuộc tính cho lớp tùy chỉnh của mình. Các @IBDesignable
thuộc tính nói với Xcode rằng nó nên cài đặt một copy running của class view tùy chỉnh của bạn vào giao diện người xây dựng, do đó bạn có thể nhìn thấy nó trong màn hình hiển thị đồ họa của hệ thống phân cấp tầm nhìn của bạn. () Thật không may, đối với lớp này, @IBDesignable
tài sản dường như không ổn định. Nó hoạt động khi tôi thêm lần đầu tiên, nhưng sau đó tôi đã xóa nội dung văn bản đơn giản của chế độ xem văn bản của mình và các liên kết có thể nhấp trong chế độ xem của tôi đã biến mất và tôi không thể lấy lại được.)
Mã cho tôi RTF_UITextView
rất đơn giản. Ngoài việc thêm @IBDesignable
thuộc tính và thuộc tính RTF_Filename
với @IBInspectable
thuộc tính, tôi đã thêm một didSet()
phương thức vào thuộc RTF_Filename
tính. Các didSet()
phương pháp được gọi bất cứ lúc nào giá trị của RTF_Filename
tài sản thay đổi. Mã cho didSet()
phương thức này khá đơn giản:
@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.");
}
}
}
}
}
Lưu ý rằng nếu thuộc tính @IBDesignable sẽ không cho phép bạn xem trước văn bản theo kiểu của mình trong Trình tạo giao diện thì tốt hơn nên đặt mã ở trên dưới dạng phần mở rộng của UITextView thay vì lớp con tùy chỉnh. Bằng cách đó bạn có thể sử dụng nó trong bất kỳ chế độ xem văn bản nào mà không phải thay đổi chế độ xem văn bản thành lớp tùy chỉnh.
Xem câu trả lời khác của tôi nếu bạn cần hỗ trợ các phiên bản iOS trước iOS 7.
Bạn có thể tải xuống một dự án mẫu bao gồm lớp mới này từ gitHub:
Dự án demo DatesInSwift trên Github