简体   繁体   中英

How can i change UITextview content

I'm fetching datas from my api and trying to write datas to UITextview but when I try this I'm getting error.

These codes are feching datas from api and write them in uitextview:

NSOperationQueue *apiCallsQueue = [[NSOperationQueue alloc] init];

NSString *urlstring=@"x.com/api.php?id=";
urlstring =[urlstring stringByAppendingString:self.newsId];

NSURL *newsdetail = [NSURL URLWithString:urlstring];
newsdetailrequest = [NSURLRequest requestWithURL:newsdetail];

@try
{
    [NSURLConnection sendAsynchronousRequest:newsdetailrequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        NSDictionary *dictionary =  [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
        [textview setText:[dictionary objectForKey:@"title"]];
    }];
}
@catch (NSException *exception)
{
    UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Error"
                                                       delegate:nil
                                              cancelButtonTitle:@"Tamam"
                                              otherButtonTitles:nil];
    [errorView show];
}

error output :

2013-06-18 16:37:16.214 xpro[6816:5103] bool _WebTryThreadLock(bool), 0x7142ee0: Tried to obtain the web lock from a thread other than the main thread or the web thread. This may be a result of calling to UIKit from a secondary thread. Crashing now...
1   0x3571fe9 WebThreadLock
2   0x15846e -[UITextView setText:]
3   0x5f00 __39-[NewsDetailViewController viewDidLoad]_block_invoke
4   0xbdbcf8 __block_global_0
5   0xb4375a -[NSBlockOperation main]
6   0xb11453 -[__NSOperationInternal start]
7   0xb11164 -[NSOperation start]
8   0xb9da31 __block_global_6
9   0x49ff53f _dispatch_call_block_and_release
10  0x4a11014 _dispatch_client_callout
11  0x4a022e8 _dispatch_root_queue_drain
12  0x4a02450 _dispatch_worker_thread2
13  0x96c53e72 _pthread_wqthread
14  0x96c3bd2a start_wqthread
(lldb) 

here is my Controller.h

@interface NewsDetailViewController : UIViewController
{
NSURLRequest *newsdetailrequest;
NSMutableData *newsdetailData;
}
@property (weak, nonatomic) IBOutlet UINavigationBar *newsdetailTitle;
@property (weak, nonatomic) IBOutlet NSString *navBarTitle;
@property (weak, nonatomic) IBOutlet NSString *newsId;
@property (weak, nonatomic) IBOutlet UITextView *htmlDetail;

It looks like you're trying to access UIKit from a background thread, which isn't recommended.

Try this: [textview performSelectorOnMainThread:@selector(setText:) withObject:[dictionary objectForKey:@"title"] waitUntilDone:YES];

This ensures that setText: is called on the main thread.

Actually the error says, what happens. UI code must run on main thread. The following will fix the error. Put that in the completionHandler block.

dispatch_async(dispatch_get_main_queue(), ^{
                                  //do ui operations like setting textview text
                              });

Try this.

Dispatch into the main thread for UI updates.

NSOperationQueue *apiCallsQueue = [[NSOperationQueue alloc] init];

NSString *urlstring=@"x.com/api.php?id=";
urlstring =[urlstring stringByAppendingString:self.newsId];

NSURL *newsdetail = [NSURL URLWithString:urlstring];
newsdetailrequest = [NSURLRequest requestWithURL:newsdetail];

@try
{
    [NSURLConnection sendAsynchronousRequest:newsdetailrequest queue:apiCallsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
    {
        NSDictionary *dictionary =  [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];

        dispatch_async(dispatch_get_main_queue(),
        ^{
            [textview setText:[dictionary objectForKey:@"title"]];
        });
    }];
}
@catch (NSException *exception)
{
    UIAlertView *errorView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Error"
                                                       delegate:nil
                                              cancelButtonTitle:@"Tamam"
                                              otherButtonTitles:nil];
    [errorView show];
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM