How to load rtf using url instead of local

别说谁变了你拦得住时间么 提交于 2019-12-13 07:28:03

问题


I have code to load local rtf files in textview but how to do i make it works for files located online

Since it does not works when i use url Here is url - http://howtotechworld.com/rtfdoc.rtf

Here is code

  if let rtf = NSBundle.mainBundle().URLForResource("http://howtotechworld.com/rtfdoc", withExtension: "rtf", subdirectory: nil, localization: nil) {
  do {
            let attributedString = try NSAttributedString(fileURL: rtf, options: [NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType], documentAttributes: nil)
            textView.attributedText = attributedString
            textView.editable = false
            print(attributedString)
   }
   catch _ {
            NSLog("catched a error");
   }

回答1:


You should download your rtf data asynchronously and use NSAttributedString initialiser init(data: NSData, options: [String : AnyObject], documentAttributes dict: AutoreleasingUnsafeMutablePointer<NSDictionary?>) throws to load your data when completed:

// your web link
let rtfLink  = "http://www.aliectronics.com.au/thefournobletruths.rtf"
// make sure your link is valid NSURL using guard  
guard let rtfURL = NSURL(string: rtfLink ) else { return }
// creata a data task for your url
NSURLSession.sharedSession().dataTaskWithURL(rtfURL) {
    (data, response, error) in
    // use guard to make sure you get a valid response from the server and your data it is not nil and you got no errors otherwise return 
    guard
        let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
        let data = data where error == nil
    else { return }
    // you need to use dispatch async to update the UI
    dispatch_async(dispatch_get_main_queue(), { () -> Void in
        // NSAttributedString data initialiser throws an error so you need to implement Swift2 Do Try Catch error handling
        do {
            let attributedString = try NSAttributedString(data: data, options: [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType], documentAttributes: nil)
            textView.attributedText = attributedString
            textView.editable = false
            print("attributedString=====start")
            print(attributedString)
            print("attributedString=====end")
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    })
}.resume()



回答2:


This works in a Playground (obviously needs better handling of optionals than forced unwrapping, but you get the point):

import UIKit

let url = NSURL(string: "http://thewalter.net/stef/software/rtfx/sample.rtf")
let data = NSData(contentsOfURL: url!)

do {
  let options = [NSDocumentTypeDocumentAttribute : NSRTFTextDocumentType]
  let attributedString = try NSAttributedString(data: data!, options: options, documentAttributes: nil)
  print(attributedString)
} catch {
  NSLog("\(error)")
}


来源:https://stackoverflow.com/questions/34893796/how-to-load-rtf-using-url-instead-of-local

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!