我的应用程序在手机上运行时出现此错误:
我只是试图解析一个json并尝试在两列自定义单元格中使用图像,但我滚动的图像被错误放置。
int index=indexPath.row*2;
int newindex=index+1;
NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];
NSLog(@"NSDictionary *u = [results objectAtIndex:index] %@",u);
NSDictionary *u1 = [[results objectAtIndex:newindex]mutableCopy];
NSLog(@"NSDictionary *u1 = [results objectAtIndex:newindex] %@",u1);
但如果我同时使用index和newindex相同的值,那就可以了。
: -
: -
代码:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil suffix:(NSString *)_suffix{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
self.suffix = _suffix;
}
return self;
}
#pragma mark Table view methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)_tableView{
return 1;
}
//my new
- (NSInteger)tableView:(UITableView *)_tableView numberOfRowsInSection:(NSInteger)section{
int resultCount = [results count];
labelResultsCount.text = [NSString stringWithFormat:@"%d",resultCount];
return resultCount/2;
}
- (UITableViewCell *)tableView:(UITableView *)_tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// NSString* CellIdentifier = [NSString stringWithFormat:@"ident_%d",indexPath.row];
static NSString *CellIdentifier = @"ResultCell";
ResultCell *cell = (ResultCell *)[_tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil){
NSArray *a = [[NSBundle mainBundle] loadNibNamed:@"ResultCell" owner:self options:nil];
cell = (ResultCell *)[a objectAtIndex:0];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
}
int index=[(indexPath.row*2) copy];
int newindex=[(index+1) copy];
// save badge in dictionaory and get here and show in lable
NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];
NSLog(@"NSDictionary *u = [results objectAtIndex:newindex] %@",u);
NSDictionary *u1 = [[results objectAtIndex:newindex]mutableCopy];
NSLog(@"NSDictionary *u1 = [results objectAtIndex:indexPath.row*2+1 newindex] %@",u1);
@try {
/* fullName */
NSString *nickName = [u objectForKey:@"nickName"];
cell.labelName.text = nickName;
NSString *nickName1 = [u1 objectForKey:@"nickName"];
cell.labelName1.text = nickName1;
/* chat notification*/
cell.imageViewNotification.hidden=0;
cell.imageViewNotification1.hidden=0;
NSString *badge = [u objectForKey:@"badge"];
NSString *badge1 = [u1 objectForKey:@"badge"];
if([badge intValue]>0)
{
cell.imageViewNotification.hidden=0;
cell.labelNotification.text = badge;
NSLog(@"inside > 0 %@",badge);
}
else if([badge intValue]<=0)
{
cell.imageViewNotification.hidden=1;
cell.labelNotification.text=@"";
NSLog(@"%@",badge);
}
if([badge1 intValue]>0)
{
cell.imageViewNotification1.hidden=0;
cell.labelNotification1.text = badge1;
NSLog(@"inside > 0 %@",badge1);
}
else if([badge1 intValue]<=0)
{
cell.imageViewNotification1.hidden=1;
cell.labelNotification1.text=@"";
NSLog(@"%@",badge1);
}
/*..................*/
/* distance */
id distance = [u objectForKey:@"distance"];
if([distance isKindOfClass:[NSString class]]){
cell.labelDistance.text = distance;
cell.imageViewDistance.hidden = 0;
}else{
cell.imageViewDistance.hidden = 1;
cell.labelDistance.text = @"";
}
id distance1 = [u1 objectForKey:@"distance"];
if([distance1 isKindOfClass:[NSString class]]){
cell.labelDistance1.text = distance1;
cell.imageViewDistance1.hidden = 0;
}else{
cell.imageViewDistance1.hidden = 1;
cell.labelDistance1.text = @"";
}
/* online */
NSNumber *online = [u objectForKey:@"online"];
cell.imageViewOnline.image = [online intValue] ? [UIImage imageNamed:@"circle_online.png"] : [UIImage imageNamed:@"circle_offline_red.png"];
NSNumber *online1 = [u1 objectForKey:@"online"];
cell.imageViewOnline1.image = [online1 intValue] ? [UIImage imageNamed:@"circle_online.png"] : [UIImage imageNamed:@"circle_offline_red.png"];
/* buttonProfile */
id d = [u objectForKey:@"thumbnails"];
id d1 = [u1 objectForKey:@"thumbnails"];
if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){
NSString *imageSuffix = [d objectForKey:@"icon"];
NSString *imageSuffix1 = [d1 objectForKey:@"icon"];
NSLog(@"[d allKeys] count]%@", d);
NSLog(@"[d1 allKeys] count]%@", d1);
UIImage *image = [[SharingCenter sharedManager] imageFromCache:imageSuffix];
UIImage *image1 = [[SharingCenter sharedManager] imageFromCache:imageSuffix1];
if(image||image1)
{
[cell.buttonUserProfile setBackgroundImage:image forState:UIControlStateNormal];
[cell.buttonUserProfile1 setBackgroundImage:image1 forState:UIControlStateNormal];
}
else{
NSString *gender = [u objectForKey:@"gender"];
NSString *gender1 = [u1 objectForKey:@"gender"];
UIImage *profileDefualtImage = [gender isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
UIImage *profileDefualtImage1 = [gender1 isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
[cell.buttonUserProfile setBackgroundImage:profileDefualtImage forState:UIControlStateNormal];
[cell.buttonUserProfile1 setBackgroundImage:profileDefualtImage1 forState:UIControlStateNormal];
/* downlowd Image */
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",WebServicePrefix,imageSuffix]];
__block
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
request.delegate = self;
[request setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].latitude] forKey:@"lat"];
[request setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].longitude] forKey:@"lon"];
// [[[SharingCenter sharedManager] imagesCache] removeAllObjects];
[request setCompletionBlock:^{
NSData *imageData = [request responseData];
if(imageData){
UIImage *image = [UIImage imageWithData:imageData];
if(image){
[[[SharingCenter sharedManager] imagesCache] setObject:image forKey:imageSuffix];
if([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]){
ResultCell *cell = (ResultCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.buttonUserProfile setBackgroundImage:image forState:UIControlStateNormal];
}
}
}
}];
[request setFailedBlock:^{
NSError *error = request.error;
NSLog(@"%@",error);
}];
/* downlowd Image */
NSURL *url1 = [NSURL URLWithString:[NSString stringWithFormat:@"%@%@",WebServicePrefix,imageSuffix1]];
__block
ASIFormDataRequest *request1 = [ASIFormDataRequest requestWithURL:url1];
request1.delegate = self;
[request1 setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].latitude] forKey:@"lat"];
[request1 setPostValue:[NSString stringWithFormat:@"%f",[[SharingCenter sharedManager] currentCoordinate].longitude] forKey:@"lon"];
// [[[SharingCenter sharedManager] imagesCache] removeAllObjects];
[request1 setCompletionBlock:^{
NSData *imageData1 = [request1 responseData];
if(imageData1){
UIImage *image1 = [UIImage imageWithData:imageData1];
if(image1){
[[[SharingCenter sharedManager] imagesCache] setObject:image1 forKey:imageSuffix1];
if([[self.tableView indexPathsForVisibleRows] containsObject:indexPath]){
ResultCell *cell = (ResultCell *)[self.tableView cellForRowAtIndexPath:indexPath];
[cell.buttonUserProfile1 setBackgroundImage:image1 forState:UIControlStateNormal];
}
}
}
}];
[request1 setFailedBlock:^{
NSError *error = request1.error;
NSLog(@"%@",error);
}];
[[self networkQueue] addOperation:request];
[[self networkQueue] addOperation:request1];
}
}
}
else{
NSString *gender = [u objectForKey:@"gender"];
NSString *gender1 = [u1 objectForKey:@"gender"];
UIImage *profileDefualtImage = [gender isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
[cell.buttonUserProfile setBackgroundImage:profileDefualtImage forState:UIControlStateNormal];
UIImage *profileDefualtImage1 = [gender1 isEqualToString:@"M"] ? [UIImage imageNamed:@"no_photo_male.png"] : [UIImage imageNamed:@"no_photo_female.png"];
[cell.buttonUserProfile1 setBackgroundImage:profileDefualtImage1 forState:UIControlStateNormal];
}
/* pickStatus */
NSNumber *pickStatus = [u objectForKey:@"pick_status"];
NSNumber *pickStatus1 = [u1 objectForKey:@"pick_status"];
switch ([pickStatus intValue]) {
case 0:
cell.imageViewBorder.image = [UIImage imageNamed:@"border_yellow_transperent.png"];
cell.buttonUserPick.enabled = 1;
[cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
break;
case 1:
cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick.enabled = 0;
[cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_wait.png"] forState:UIControlStateDisabled];
break;
case 2:
cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick.enabled = 1;
[cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
break;
case 3:
cell.imageViewBorder.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick.enabled = 0;
[cell.buttonUserPick setBackgroundImage:[UIImage imageNamed:@"button_circle_date.png"] forState:UIControlStateDisabled];
break;
default:
break;
}
switch ([pickStatus1 intValue]) {
case 0:
cell.imageViewBorder1.image = [UIImage imageNamed:@"border_yellow_transperent.png"];
cell.buttonUserPick1.enabled = 1;
[cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
break;
case 1:
cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick1.enabled = 0;
[cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_wait.png"] forState:UIControlStateDisabled];
break;
case 2:
cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick1.enabled = 1;
[cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_pick.png"] forState:UIControlStateNormal];
break;
case 3:
cell.imageViewBorder1.image = [UIImage imageNamed:@"border_red_transperent.png"];
cell.buttonUserPick1.enabled = 0;
[cell.buttonUserPick1 setBackgroundImage:[UIImage imageNamed:@"button_circle_date.png"] forState:UIControlStateDisabled];
break;
default:
break;
}
}
@catch (NSException * e) {
NSLog(@"%@",e);
}
@finally {
return cell;
}
}
答案 0 :(得分:1)
你可能正在某些地方对NSDictionary
个对象做些什么,阅读他们的allKeys
。但我的猜测是,您尝试从results
数组中提取的对象不是NSDictionary
个对象,而是NSString
个对象。
尝试记录他们的class
属性以查看您正在处理的内容(当然,您也可以通过查看JSON来找到它。)
NSDictionary *u = [[results objectAtIndex:index]mutableCopy ];
NSLog(@"u Class: %@", [u class]);
另外,为什么要将mutableCopy
对象的权限设置为非可变NSDictionary
对象。
使用以下内容通常可以做到这一点:
NSDictionary* u = [results objectAtIndex:index];
NSLog(@"u Class: %@", [u class]);
答案 1 :(得分:1)
这是需要查看的大量代码,但我认为这可能是问题所在:
if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){
如果d或d1是字典,则会传递此if语句。如果不是,则会导致您在第二行看到的错误。记录d和d1的类,看看它们是否都是字典。
答案 2 :(得分:1)
受过教育的猜测:
此行会导致您的问题:
if([d isKindOfClass:[NSDictionary class]] ||[d1 isKindOfClass:[NSDictionary class]]){
if([[d allKeys] count]>0 ||[[d1 allKeys] count]>0){
第一个if的出现有4种不同的可能性:
第一种情况完全没问题。最后一种情况。在第2和第3种情况下,将在不是NSDictionary的对象上调用allKeys。
您应该将其替换为需要两个测试都为真的“if”。
if([d isKindOfClass:[NSDictionary class]] && [d1 isKindOfClass:[NSDictionary class]]){
^^
另一种选择是单独检查。
if([d isKindOfClass:[NSDictionary class]]) {
x = [d allKeys];
}
if([d1 isKindOfClass:[NSDictionary class]]) {
x = [d1 allKeys];
}