I am trying to initialize an attributed string with HTML file contents, as following:
NSMutableAttributedString *attrStr = [[[NSAttributedString alloc] initWithFileURL:[NSURL fileURLWithPath:chapterPath]
options:#{NSDocumentTypeDocumentAttribute:NSHTMLTextDocumentType}
documentAttributes:nil error:nil] mutableCopy];
and it does work with iOS7.1 and iOS8.1 and up, but something goes wrong with iOS8.0:
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: vector
Is this initialization method broken in iOS8.0? Any workaround?
BTW, I have tried to parse an RTF file and, with iOS8.0, it fails to collect any font information.
Did you try this?.
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfFile:chapterPath options:NSDataReadingUncached error:&error];
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData: data options:#{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:&attributes error:nil];
Init with HTML for NSAttributedString is on main thread only. If you doing that in background be ready to crash.
Related
My Problem is that I am getting html content form backEnd so when I had convert my NSData by using this code:
dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
I have got content like this:
<div class=\"dropzone-container\"
Where on the place of " it will automatically convert it into \" and due that when I load that data on UIWebView it would not load it respective css so I need to it to be converted like this:
<div class="dropzone-container"
Please help in this Thanks in advance........ :(
Try this. It will convert HTML to NSString.
NSString *responseInHTML = #"<html><body> Some html string </body></html>";
NSAttributedString * attrStr = [[NSAttributedString alloc] initWithData:[responseInHTML dataUsingEncoding:NSUnicodeStringEncoding] options:#{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType } documentAttributes:nil error:nil];
DLOG(#"String = %#",attrStr.string);
You can achieve your html by removing \ from string.
Example:
NSString *myHTML = [oldHTML stringByReplacingOccurrencesOfString:#"\" withString:#""];
I'm using those line of codes to create an attributed string from a simple HTML string:
NSDictionary *importParams = #{ NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType,NSCharacterEncodingDocumentAttribute: #(NSUTF8StringEncoding) };
NSError *error = nil;
NSData *stringData = [HTML dataUsingEncoding:NSUTF8StringEncoding] ;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:stringData options:importParams documentAttributes:NULL error:&error];
The issue is that is really slow (about seconds on simulator)even for few characters.
I don not understand the reason behind that and I don't want to use third party libs with custom HTML parser.
Is there any other way to create attributed string from HTML text faster than this?
I've read many Q/As on this problem but couldn't find an answer that fits my situation.
I retrieve a JSON response from a REST service I've created in PHP. This is my code:
NSURLResponse *response = nil;
NSError *theError1 = nil;
NSError *theError2 = nil;
NSURL *webServiceUrl = [NSURL URLWithString:#"http://..."];
NSURLRequest *request = [NSURLRequest requestWithURL:webServiceUrl cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:30];
NSData *theData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&theError1];
NSString *dataString = [[NSString alloc] initWithData:theData encoding:NSUTF8StringEncoding];
NSLog(#"%#", dataString);
id json = [NSJSONSerialization JSONObjectWithData:theData options:NSJSONReadingAllowFragments | NSJSONReadingMutableContainers error:&theError2];
if (theError2 != nil)
NSLog(#"%#", theError2);
When I invoke the REST call in the browser, I see the following response, which seems identical to what XCode logs:
{
"Name": "REST Service",
"Product": "REST Test",
"Version": "1.0.0.0",
"Copyright": "2013 Test Company"
}
When I execute above code, however, the following error is created and logged:
Error Domain=NSCocoaErrorDomain Code=3840 "The data couldn’t be read because it has been corrupted." (Invalid value around character 3.) UserInfo=0x100547430 {NSDebugDescription=Invalid value around character 3.}
What am I doing wrong?
OK, as always, checking the actual data instead of the string representation pays - thanks #Bavarious.
It turns out that the PHP script(s) in charge of creating the JSON were all "UTF8 with BOM", so PHP returned a BOM for every script involved.
Once I changed all the PHP files to "UTF8 without BOM" everything seems to be fine - need to test this on the MAC though.
Sorry to interrupt, keep up the good work.
(#Bavarious: If you'd like to write an answer, I'd be happy to upvote and accept it, as you pointed me to the solution).
Was able to parse the JSON now as expected. Making a mental note to always double-check the text file encoding.
NSURL *theURL = [NSURL URLWithString:#"http://yourdataurl"];
NSMutableURLRequest *storeRequest = [NSMutableURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:10];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[NSURLConnection sendAsynchronousRequest:storeRequest queue:queue
completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
if (!connectionError) {
NSError *error;
NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSData *theData = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *jsonResponse = [NSJSONSerialization JSONObjectWithData:theData options:0 error:&error];
if (!jsonResponse || error)
{
NSLog(#"Error");
}
else
{
// Everything is ok..
}
}
}];
I'm beginner from Xcode. I have to do an application that get and send data from embedded webserver that I designed in a microcontroller MICROCHIP.
Now I'm able to get information from webserver ( In my webserver I have a /status.xml file where I have all the dynamic variables)
Now I am not able to click a button. The HTML code to click a button is
onmousedown="newAJAXCommand('buttons.cgi?btn=1')"
In my webserver I have a file buttons.cgi.
My target is designed a button in Xcode that he does this action
I tried to use NSMutableURLRequest class and SetHTTPMethod:#"GET" or #"POST" but this code doesn't work
NSString *post = #"btn=1";
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
NSURL *serviceURL = [NSURL URLWithString:#"http://mywebserver.com/buttons.cgi?"];
NSMutableURLRequest *serviceRequest = [NSMutableURLRequest requestWithURL:serviceURL];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
[serviceRequest setHTTPMethod:#"POST"];
[serviceRequest setHTTPBody:postData];
There are multiple errors in the codes:
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES ];
Why don't you use UTF-8 ?
NSString *Get_lenght = [NSString stringWithFormat:#"%d",[postData length]];
[serviceRequest setValue:Get_lenght forHTTPHeaderField:#"Content-type"];
You can't set Content-Type as an integer.
Last, you didn't send out the NSMutableURLRequest. To send out the request, use :
NSString *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:serviceRequest returningResponse:&response error:&error];
where response will contain the response data, if you need it; and the error will contain error during request & response, if there is any error.
I need to read a JSON file using the NSJSONSerialization Class Reference, and all the examples that I have found about the use of this class read the content from the webpage itself, instead of reading from a JSON file that has been previously created.Anyone knows how to parse from a JSON file using that class? Thanks.
Simple, quick'n'dirty example:
NSString *jsonPath = [[NSBundle mainBundle] pathForResource:#"foobar"
ofType:#"json"];
NSData *data = [NSData dataWithContentsOfFile:jsonPath];
NSError *error = nil;
id json = [NSJSONSerialization JSONObjectWithData:data
options:kNilOptions
error:&error];
NSLog(#"JSON: %#", json);