我正在使用TTStyledTextLabel和来自XHTML数据的TTStyledText来显示新闻文章。 它工作正常,除了img是数据而不是链接,在这种情况下它会崩溃!
代码
TTStyledTextLabel *storyLabel = [[TTStyledTextLabel alloc] init];
[storyLabel setText: [TTStyledText textFromXHTML:[articleContents objectForKey:@"storyText"]]];
使用普通的img url xml,
但遇到像这样的图像数据时:
img class="alignleft" src="data:image/jpg;base64,/9j/4AAQSkZJRgA...
(lots more in here)...1HhI0T//2Q==" alt="" width="267" height="189" /
它与输出崩溃:
-[NSURLResponse allHeaderFields]: unrecognized selector
sent to instance 0xb83b370
只有在遇到图像数据时才会发生这种情况,否则如果它是正常的img链接,它就可以正常加载。
谢谢!
答案 0 :(得分:2)
问题是Three20 TTRequestLoader在NSURLConnectionDataDelegate方法中使用NSHTTPURLResponse而不是NSURLResponse。 NSURLResponse没有allHeaderFields方法,因此应用程序崩溃了。
您可以通过检查课程来修复它:
- (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSHTTPURLResponse*)response {
_response = [response retain];
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
NSDictionary* headers = [response allHeaderFields];
int contentLength = [[headers objectForKey:@"Content-Length"] intValue];
// If you hit this assertion it's because a massive file is about to be downloaded.
// If you're sure you want to do this, add the following line to your app delegate startup
// method. Setting the max content length to zero allows anything to go through. If you just
// want to raise the limit, set it to any positive byte size.
// [[TTURLRequestQueue mainQueue] setMaxContentLength:0]
TTDASSERT(0 == _queue.maxContentLength || contentLength <=_queue.maxContentLength);
if (contentLength > _queue.maxContentLength && _queue.maxContentLength) {
TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"MAX CONTENT LENGTH EXCEEDED (%d) %@",
contentLength, _urlPath);
[self cancel];
}
_responseData = [[NSMutableData alloc] initWithCapacity:contentLength];
}
else if ([response isKindOfClass:[NSURLResponse class]]) {
_responseData = [[NSMutableData alloc] init];
}
else {
[self cancel];
}
}
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
TTNetworkRequestStopped();
if ([_response isKindOfClass:[NSHTTPURLResponse class]]) {
TTDCONDITIONLOG(TTDFLAG_ETAGS, @"Response status code: %d", _response.statusCode);
// We need to accept valid HTTP status codes, not only 200.
if (_response.statusCode >= 200 && _response.statusCode < 300) {
[_queue loader:self didLoadResponse:_response data:_responseData];
} else if (_response.statusCode == 304) {
[_queue loader:self didLoadUnmodifiedResponse:_response];
} else {
TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @" FAILED LOADING (%d) %@",
_response.statusCode, _urlPath);
NSError* error = [NSError errorWithDomain:NSURLErrorDomain code:_response.statusCode
userInfo:nil];
[_queue loader:self didFailLoadWithError:error];
}
}
else if ([_response isKindOfClass:[NSURLResponse class]]) {
[_queue loader:self didLoadResponse:_response data:_responseData];
}
TT_RELEASE_SAFELY(_responseData);
TT_RELEASE_SAFELY(_connection);
}
答案 1 :(得分:0)
在这里回答我自己的问题。
这种情况似乎很罕见(在我的具体情况下)。我解决它的方法是先检查img链接(可能是图像数据)是否有一个共同的图像文件类型扩展名(jpg,png,gif等等)。我只是在没有丢弃数据的情况下忽略它。
我不太了解Web标准以及将图像数据嵌入链接应该是否合适,但我现在知道它存在并且可能导致使用此类崩溃。希望这可以帮助任何有这个问题的人。