所以我知道这个错误的原因,但我不确定如何绕过它.
我有一个TextField
我想不可编辑,但在视图中启用滚动.
这是我设置该视图的方式:
- (void)tableView:(UITableView *) tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ NSDictionary *component = self.resultsTuples[indexPath.row]; NSString* serverUrl = @"http://staging.toovia.com"; NSString* pageLink = component[@"$element"][@"ContactCard"][@"PageLink"]; NSString* recUrl =[NSString stringWithFormat:@"%@%@&format=json&fields=summary&fields=session_info", serverUrl,pageLink]; [AJAXUtils getAsyncJsonWithUrl:(NSURL *)[NSURL URLWithString:recUrl] callback:^(NSDictionary *returnjson){ if (returnjson != nil){ NSLog(@"RETURN JSON : %@", returnjson); NSString *userPageLink = returnjson[@"Node"][@"SessionInfo"][@"PostingAs"][@"Key"]; self.detailController.userPageLink = userPageLink; self.detailController.nodePage = returnjson[@"Node"][@"Key"]; NSString *selectedCard = component[@"$element"][@"Title"]; // [self.detailController setDescription:component[@"element"][@"ContactCard"][@"Description"]]; [self.detailController setPageTitle:selectedCard]; NSString* photoUrl = component[@"$element"][@"ContactCard"][@"Cover"][@"Medium"][@"Link"]; [self.detailController setRestaurantImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:photoUrl]]]]; self.detailController.title = selectedCard; NSString* rating = component[@"$element"][@"Summary"][@"AverageRating"]; self.detailController.rating =(NSInteger)rating; [self.navigationController pushViewController:self.detailController animated:YES]; } }];
这是viewWillAppear
视图的代码:
-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear: animated]; self.rateView.notSelectedStar =[UIImage imageNamed:@"star-off.png"]; self.rateView.fullSelectedStar = [UIImage imageNamed:@"star-on.png"]; self.rateView.rating = self.rating; self.rateView.editable = YES; self.rateView.maxRating = 5; self.rateView.delegate = self; _pageTitleLabel.text = _pageTitle; _pageScoreLabel.text = _pageScore; _trendingImageView.image = [UIImage imageNamed:@"trending.png"]; _restaurantImageView.image = _restaurantImage; }
完整的错误是 -
2013-12-16 01:22:50.362 ReviewApp[7332:441f] *** Assertion failure in void _UIPerformResizeOfTextViewForTextContainer(NSLayoutManager *, UIView*, NSTextContainer *, NSUInteger)(), /SourceCache/UIFoundation_Sim/UIFoundation-258.1/UIFoundation/TextSystem/NSLayoutManager_Private.m:1510 2013-12-16 01:22:50.365 ReviewApp[7332:441f] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Only run on the main thread!'
所以我猜它正在发生,因为文本字段的大小调整(当设置内容时)必须在主线程上发生.如何强制这种情况发生/抑制此错误?我不能控制文本字段调整大小吗?
谢谢
我猜测回调来自AJAXUtils
后台线程.我不知道这是不是你的代码,但你应该在主线程上做所有的UI操作(比如在标签中设置文本,在图像视图中设置图像,推动视图控制器).
dispatch_sync(dispatch_get_main_queue(), ^{ /* Do UI work here */ });
您必须始终在主线程上执行UI代码.你不是,因此错误.试试这个:
[AJAXUtils getAsyncJsonWithUrl:(NSURL *)[NSURL URLWithString:recUrl] callback:^(NSDictionary *returnjson){ if (returnjson != nil){ NSLog(@"RETURN JSON : %@", returnjson); NSString *userPageLink = returnjson[@"Node"][@"SessionInfo"][@"PostingAs"][@"Key"]; self.detailController.userPageLink = userPageLink; self.detailController.nodePage = returnjson[@"Node"][@"Key"]; NSString *selectedCard = component[@"$element"][@"Title"]; // [self.detailController setDescription:component[@"element"][@"ContactCard"][@"Description"]]; [self.detailController setPageTitle:selectedCard]; NSString* photoUrl = component[@"$element"][@"ContactCard"][@"Cover"][@"Medium"][@"Link"]; [self.detailController setRestaurantImage:[UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:photoUrl]]]]; self.detailController.title = selectedCard; NSString* rating = component[@"$element"][@"Summary"][@"AverageRating"]; self.detailController.rating =(NSInteger)rating; dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController pushViewController:self.detailController animated:YES]; }); } }];
这可确保视图控制器的显示位于主线程上.实际上,您可能需要在调用中添加更多代码dispatch_async
.
Swift 3.0版
DispatchQueue.main.async(execute: { /* Do UI work here */ })