NSRangeException当我尝试将html字符串转换为iOS中的属性字符串时

问题描述 投票:-1回答:2

我使用下面的代码将html字符串转换为NSAttributedText并将其设置为UITextView。在尝试将其设置为textfield的attributedText值时,它会针对特定的阿拉伯文本字符串崩溃,从而产生错误:

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSBigMutableString getCharacters:range:]: Range {6669, 1} out of bounds; string length 5267'
extension String {
    var htmlToAttributedString: NSAttributedString? {
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do {
            return try NSAttributedString(data: data, options: [.documentType: NSAttributedString.DocumentType.html, .characterEncoding:String.Encoding.utf8.rawValue], documentAttributes: nil)
        } catch {
            return NSAttributedString()
        }
    }
}

阿拉伯字符串是

"<span style=\"font-size: 17; font-family: \'Roboto\';\"><h4 style=\"text-align: justify;\">الشروط والأحكام الخاصة باستخدام الموقع</h4><p style=\"text-align: justify;\">إن دخولك واستخدامك للموقع الإلكتروني لمؤسسة محمد بن راشد آل مكتوم للمعرفة \"الموقع\" يخضع للشروط والأحكام التالية، بالإضافة إلى قوانين دولة الإمارات العربية المتحدة. دخولك إلى الموقع يعني موافقتك على هذه الشروط والأحكام، سواء أكنت مستخدماً مسجلاً أم لا. وبدخولك وتصفحك واستخدامك للموقع فإنك تكون قد قبلت، من دون قيد أو شرط، أحكام وشروط الاستخدام الواردة في هذه الوثيقة.</p><h4 style=\"text-align: justify;\">تعديل الاتفاقية</h4><p style=\"text-align: justify;\">لمؤسسة محمد بن راشد آل مكتوم للمعرفة الحق في تعديل هذه الشروط والأحكام على أن يتم وضع إشعار بحدوث تعديلات على هذه الصفحة، وتدخل التعديلات حيز النفاذ بمجرد إحداثها مالم ينَصّ بخلاف ذلك. إن استخدامك المتكرر للموقع بعد إحداث تلك التعديلات يعني موافقتك على التعديلات. ويتعين عليك القيام بزيارات دورية لهذه الصفحة لمراجعة شروط وأحكام الاستخدام الحالية.</p><h4 style=\"text-align: justify;\">التصرف</h4><p style=\"text-align: justify;\">أنت توافق على دخول واستخدام الموقع لأغراض مشروعة فقط، وأنت مسؤول مسؤولية كاملة عن العلم والعمل بأي من وكل القوانين والأنظمة والقواعد والأحكام المتعلقة باستخدامك للموقع. وبمجرد دخولك إلى الموقع فإنك توافق على الامتناع عن: 1- استخدام الموقع من أجل ارتكاب جرم أو تشجيع الآخرين على التورط في أي تصرف قد يعد جريمة أو ينطوي على مسؤولية مدنية. 2- إدخال أو نشر أي محتويات غير قانونية تتضمن تمييزاً أو تشهيراً أو إساءة أو قذفاً أو فاحشة أو مواد إباحية. 3- استخدام الموقع من أجل انتحال شخصيات أو أطراف أخرى 4- استخدام الموقع لتحميل أي مادة فيها برامج تحتوي على فيروسات، أحصنة طروادة، أو أي شفرات حاسوبية أو ملفات أو برامج قد تعمل على تغيير أو إتلاف أو إعاقة عمل الموقع أو أي جهاز أو برنامج عائد إلى أي شخص يدخل إلى الموقع. 5- تحميل أو إدخال أو إرسال أو أي بث بخلاف ذلك لمواد لا يحق لك بثها بموجب أي قانون أو علاقة تعاقدية. 6- تغيير أو إتلاف أو شطب أي محتوى على الموقع. 7- تعطيل خطوط الاتصال الاعتيادية بأي شكل كان. 8- الادعاء بالارتباط مع، أو تمثيل أي شركة أو جمعية أو هيئة من دون أن تكون مخولاً بادعاء تلك العلاقة أو ذلك التمثيل. 9- نشر أو بث أي إعلان أو مادة دعائية أو أي شكلٍ من أشكال الترويج. 10- نشر أي مادة تتنافى أو تتعارض مع حقوق الملكية الفكرية للآخرين، 11- جمع أو تخزين المعلومات الشخصية عن الآخرين.</p><h4 style=\"text-align: justify;\">التسجيل</h4><p style=\"text-align: justify;\">بعض أجزاء الموقع لا تفتح إلا للأعضاء المسجلين و/أو تتيح للمستخدم طلب الدعم أو الخدمات إلكترونياً عبر إدخال المعلومات الشخصية. أنت توافق على أن أي معلومات تقدم لنا عبر تلك الأجزاء هي معلومات كاملة ودقيقة، وأنك لن تقوم بالتسجيل، ولن تحاول دخول الموقع مستخدماً اسم شخص آخر، ولن تتبنى اسم مستخدم قد ترى حكومة دبي الإلكترونية، وفق حرية تصرفها، غير مناسب.</p><h4 style=\"text-align: justify;\">إنهاء الاستخدام</h4><p style=\"text-align: justify;\">لمؤسسة محمد بن راشد آل مكتوم للمعرفة كل الحق، وفق ما تراه مناسباً، في إنهاء أو تعليق دخولك إلى واستخدامك لهذا الموقع من دون إشعار ولأي سبب كان، بما في ذلك انتهاك هذه الشروط والأحكام أو بسبب أي تصرف قد ترى مؤسسة محمد بن راشد آل مكتوم للمعرفة، بملء حريتها، أنه مخالف للقانون أو مضر بالآخرين. وفي حال الإنهاء، لن يعود بإمكانك الدخول إلى الموقع، وستستخدم مؤسسة محمد بن راشد آل مكتوم للمعرفة كل وسيلة متاحة لتطبيق هذا المنع.</p><h4 style=\"text-align: justify;\">وصلات المواقع الأخرى</h4><p style=\"text-align: justify;\">بعض الوصلات على الموقع تقود إلى مواقع إلكترونية لا يتم تشغيلها من قبل مؤسسة محمد بن راشد آل مكتوم للمعرفة. ليس للمؤسسة سيطرة على تلك المواقع، كما أننا لا نقوم بمراجعة أو التحكم بالمحتوى الخاص بتلك المواقع. إن المؤسسة تلك الوصلات من باب التسهيل على المستخدمين، وليس لتلك الوصلات أي مضامين ترويجية خاصة بالسلع أو الخدمات أو المعلومات، وهي لا تنطوي على أي ربط ما بين مؤسسة محمد بن راشد ال مكتوم للمعرفة ومشغلي المواقع المتصلة. وعند اختيارك لوصلة خاصة بموقع خارجي، فإنك تكون خاضعاً للشروط والأحكام الخاصة بمالك/راعي ذلك الموقع الخارجي.</p><h4 style=\"text-align: justify;\">المحتوى</h4><p style=\"text-align: justify;\">تحتفظ مؤسسة محمد بن راشد آل مكتوم للمعرفة بالحق في مراقبة أي محتوى يتم إدخاله من قبلك، غير أنها ليست ملزمة بذلك. ومع أن المؤسسة لا تستطيع مراقبة كل ما يتم إدخاله على الموقع، فإننا نحتفظ بالحق (من دون التزام) في شطب أو إزالة أو تحرير أي مواد مدخلة من شأنها انتهاك هذه الشروط والأحكام. إن قوانين حقوق النشر والتأليف الإماراتية والأجنبية والمعاهدات الدولية تحمي محتويات هذا الموقع. وأنت توافق على الالتزام بإشعارات حقوق النشر التي تظهر على هذا الموقع.</p><h4 style=\"text-align: justify;\">التعويض</h4><p style=\"text-align: justify;\">أنت توافق على الدفاع عن، وتأمين، والحفاظ على سلامة مؤسسة محمد بن راشد آل مكتوم للمعرفة وكل موظفيها ووكلائها تجاه أي وكل مسؤولية قد تترتب على أي مطالبة ناجمة عن أي خرق من قبلك لهذه الشروط والأحكام، بما في ذلك التكاليف والرسوم المعقولة للمحامين. أنت توافق على التعاون الكامل في الدفاع ضد تلك المطالبات. لمؤسسة محمد بن راشد آل مكتوم للمعرفة الحق في أن تتولى، على حسابها الخاص، الدفاع الحصري والتحكم في أي مسألة خاضعة، بخلاف ذلك، للتعويض من قبلك. وأنت توافق على عدم تسوية أي قضية إلا بموافقة خطية من قبل مؤسسة محمد بن راشد آل مكتوم للمعرفة.</p><h4 style=\"text-align: justify;\">تنازل عن الضمان</h4><p style=\"text-align: justify;\">أنت تفهم بوضوح وتوافق على أن استخدامك للموقع أو أي مادة متاحة من خلاله هي خاضعة لمسؤوليتك الخاصة. ولا توفر مؤسسة محمد بن راشد آل مكتوم للمعرفة ولا أي من موظفيها ضمانة بأن الموقع لن يتعرض للتوقف أو أنه سيكون خالياً من المشاكل أو الحذف أو الأخطاء، كما لا توجد ضمانة بشأن النتيجة التي ستحصل عليها جراء استخدامك للموقع. إن المحتويات والأدوات على الموقع مقدمة لك على حالها، من دون ضمانات من أي نوع، سواء كانت صريحة أو ضمنية، بما في ذلك، ولكن ليس مقتصراً على، ضمانات الاسم، والصلاحية السوقية، والملائمة لغرض أو استخدام معين، أو الرواج.</p><h4 style=\"text-align: justify;\">حدود المسؤولية</h4><p style=\"text-align: justify;\">لا تتحمل مؤسسة محمد بن راشد آل مكتوم للمعرفة المسؤولية بأي حال من الأحوال عن الأضرار العرضية أو غير المباشرة أو الخاصة أو العقابية أو النموذجية أو الناشئة، والتي قد تبرز نتيجة لاستخدامك أو عدم قدرتك على استخدام الموقع، بما في ذلك، ومن دون حصر، ضياع الدخل أو الأرباح المتوقعة، أو ضياع السمعة أو ضياع العمل أو ضياع البيانات، أو تعطل الكمبيوتر أو عمله بصورة خاطئة أو أي أضرار أخرى.</p></span>"

我在用

// .. in Constants.swift
static let arDescription = "<style>font{font-size: 17; font-family: \"Roboto\"} ul,p,h4{direction: rtl;} rtl{direction: rtl;}</style><div class=\"font rtl\">%@</div>"
// ...

if let desc = data["description"] {
    let str = String(format: Constants.arDescription, desc).htmlToAttributedString
    this.detailsText.attributedText = str
} else {
    this.detailsText.text = ""
}

如何解决这个问题?

html ios swift uitextview nsattributedstring
2个回答
0
投票

试试这个:

extension String{    
    func convertHtmlToAttributedString() -> NSAttributedString{
        guard let data = data(using: .utf8) else { return NSAttributedString() }
        do{
        return try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: String.Encoding.utf8.rawValue], documentAttributes: nil)
        }catch{
            return NSAttributedString()
        }
    }
}

-1
投票

我通过使用以下方法更新textview解决了这个问题。

this.detailsText.textStorage.append(str.htmlToAttributedString ?? NSAttributedString())
© www.soinside.com 2019 - 2024. All rights reserved.