2012-03-24 2 views
3

UITextView 텍스트를 변경하려고하면 내 앱이 다운됩니다. (헤더 파일) :UITextView.text를 변경하려고 할 때 응용 프로그램이 손상되었습니다.

// 
#import <UIKit/UIKit.h> 

@interface DetailViewController : UIViewController { 

    IBOutlet UIImageView *appImage; 
    IBOutlet UILabel *appName; 
    IBOutlet UILabel *appDeveloper; 
    IBOutlet UILabel *appVersion; 
    UIActivityIndicatorView *loading; 
    IBOutlet UITextView *appAbout; 
    NSString *selectedApp; 

} 

@property (nonatomic, retain) NSString *selectedApp; 
@property (nonatomic, retain) IBOutlet UIImageView *appImage; 
@property (nonatomic, retain) IBOutlet UILabel *appName; 
@property (nonatomic, retain) IBOutlet UILabel *appDeveloper; 
@property (nonatomic, retain) IBOutlet UILabel *appVersion; 
@property (nonatomic, retain) UIActivityIndicatorView *loading; 
@property (nonatomic, retain) UITextView *appAbout; 

@end 

구현 파일 :

- (void)loadData { 

    NSString *trimmedString = [selectedApp stringByReplacingOccurrencesOfString:@" " withString:@"%20"]; 
    self.navigationItem.title = @"Info"; 
    NSLog(@"%@", trimmedString); 
    NSString *website = [NSString stringWithFormat:@"http://shaymargolisapps.x10.mx/send.php?mission=GetNameOfApps&aname=%@", trimmedString]; 
    NSData *dataURL = [NSData dataWithContentsOfURL:[NSURL URLWithString:website]]; 
    NSString *strResult = [[[NSString alloc] initWithData:dataURL encoding:NSUTF8StringEncoding]autorelease]; 
    appName.text = strResult; 
    NSString *website1 = [NSString stringWithFormat:@"http://shaymargolisapps.x10.mx/send.php?mission=GetDeveloperOfApp&aname=%@", trimmedString]; 
    NSData *dataURL1 = [NSData dataWithContentsOfURL:[NSURL URLWithString:website1]]; 
    NSString *strResult1 = [[[NSString alloc] initWithData:dataURL1 encoding:NSUTF8StringEncoding]autorelease]; 
    appDeveloper.text = strResult1; 
    NSString *website2 = [NSString stringWithFormat:@"http://shaymargolisapps.x10.mx/send.php?mission=GetVersionOfApp&aname=%@", trimmedString]; 
    NSData *dataURL2 = [NSData dataWithContentsOfURL:[NSURL URLWithString:website2]]; 
    NSString *strResult2 = [[[NSString alloc] initWithData:dataURL2 encoding:NSUTF8StringEncoding]autorelease]; 
    appVersion.text = strResult2; 
    NSString *website3 = [NSString stringWithFormat:@"http://shaymargolisapps.x10.mx/send.php?mission=GetInfoOfApp&aname=%@", trimmedString]; 
    NSData *dataURL3 = [NSData dataWithContentsOfURL:[NSURL URLWithString:website3]]; 
    NSString *strResult3 = [[[NSString alloc] initWithData:dataURL3 encoding:NSUTF8StringEncoding]autorelease]; 
    NSLog(@"%@", strResult3); 
    **appAbout.text = strResult3;** 
    NSString *website4 = [NSString stringWithFormat:@"http://shaymargolisapps.x10.mx/send.php?mission=GetImageOfApp&aname=%@", trimmedString]; 
    NSData *dataURL4 = [NSData dataWithContentsOfURL:[NSURL URLWithString:website4]]; 
    NSString *strResult4 = [[[NSString alloc] initWithData:dataURL4 encoding:NSUTF8StringEncoding]autorelease]; 
    NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strResult4]]; 
    UIImage* image = [[UIImage alloc] initWithData:imageData]; 
    [appImage setImage:image]; 
    [image release]; 
    [imageData release]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [loading stopAnimating]; 
    [loading setHidden:YES]; 
    [appName setHidden:NO]; 
    [appDeveloper setHidden:NO]; 
    [appVersion setHidden:NO]; 
    [appImage setHidden:NO]; 
    [appAbout setHidden:NO]; 

} 

내 애플은 appAbout.text = strResult3; 줄에 추락 여기

는 코드입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

loadData은 viewDidLoad

(엑스 코드 4.4 DP2, 아이폰 시뮬레이터 5.1, 기본 SDK 4.3)

+0

충돌로 인한 오류 메시지는 무엇인가요? 또한 strResult3의 내용을 출력하는 NSLog 문이 예상 한 결과를 제공합니까? – jonkroll

+0

예. NSLog 내 예상 출력을 제공합니다. CRASH ERROR MASSAGE : – theShay

+0

'bool _WebTryThreadLock (bool), 0x6d9d7d0 : 메인 스레드 나 웹 스레드가 아닌 다른 스레드에서 웹 잠금을 얻으려고 시도했습니다. 이것은 보조 스레드에서 UIKit을 호출 한 결과 일 수 있습니다. 이제 충돌 ... 1 WebThreadLock 2 - [UITextView의 setText :] 3 - [DetailViewController loadData] 4 - [NSThread 주] 7 thread_start' – theShay

답변

4

에서 [self performSelectorInBackground:@selector(loadData) withObject:nil]; 불려 당신은 * UI를 변경해서는 안 백그라운드 스레드에서 오브젝트. 그것은 메인 스레드에서 수행되어야합니다.

gcd를 사용하여 주 스레드에서 변경 작업을 수행 할 수 있습니다. 다음과 같은 내용 :

/* ... */ 
NSString *strResult4 = [[[NSString alloc] initWithData:dataURL4 encoding:NSUTF8StringEncoding]autorelease]; 
NSData* imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:strResult4]]; 
UIImage* image = [[UIImage alloc] initWithData:imageData]; 

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.navigationItem.title = @"Info"; 
    appName.text = strResult; 
    appDeveloper.text = strResult1; 
    appVersion.text = strResult2; 
    appAbout.text = strResult3; 
    [appImage setImage:image]; 
    [UIApplication sharedApplication].networkActivityIndicatorVisible = NO; 
    [loading stopAnimating]; 
    [loading setHidden:YES]; 
    [appName setHidden:NO]; 
    [appDeveloper setHidden:NO]; 
    [appVersion setHidden:NO]; 
    [appImage setHidden:NO]; 
    [appAbout setHidden:NO]; 
}); 

[image release]; 
[imageData release]; 
관련 문제