' – :无法识别的select器发送到实例' – 试图找出原因

我有一个UITableView自定义UILabel为标题和另一个字幕,以alignment文本到正确的。

我的数据来自Web服务,我parsing并存储在NSDictionary NSArray中。 一些标题或副标题可以是零/空文本。 为此,我把它放在try / catch中。

我的表中的一行使我的应用程序暗恋,我不明白为什么。

我认为他们之一(标题/副标题)返回作为NSDictionary但我做了我的对象类的日志打印,因为我的[UILabel text] ,似乎一切正常。

exception和堆栈跟踪:

 2014-04-29 10:47:55.985 Cellular Radar[3226:60b] -[__NSDictionaryI length]: unrecognized selector sent to instance 0x16d007f0 2014-04-29 10:47:55.993 Cellular Radar[3226:60b] -[Home tableView:willDisplayCell:forRowAtIndexPath:], exception.reason: -[__NSDictionaryI length]: unrecognized selector sent to instance 0x16d007f0 2014-04-29 10:47:55.999 Cellular Radar[3226:60b] -[__NSDictionaryI length]: unrecognized selector sent to instance 0x16d007f0 2014-04-29 10:47:56.006 Cellular Radar[3226:60b] CRASH: -[__NSDictionaryI length]: unrecognized selector sent to instance 0x16d007f0 2014-04-29 10:47:56.062 Cellular Radar[3226:60b] Stack Trace: ( 0 CoreFoundation 0x30e02feb <redacted> + 154 1 libobjc.A.dylib 0x3b5b1ccf objc_exception_throw + 38 2 CoreFoundation 0x30e06967 <redacted> + 202 3 CoreFoundation 0x30e05253 <redacted> + 706 4 CoreFoundation 0x30d547b8 _CF_forwarding_prep_0 + 24 5 UIKit 0x33637ed3 <redacted> + 38 6 UIKit 0x337595bb <redacted> + 3682 7 UIKit 0x33758031 <redacted> + 60 8 UIKit 0x3361ed79 <redacted> + 380 9 QuartzCore 0x3329c62b <redacted> + 142 10 QuartzCore 0x33297e3b <redacted> + 350 11 QuartzCore 0x33297ccd <redacted> + 16 12 QuartzCore 0x332976df <redacted> + 230 13 QuartzCore 0x332974ef <redacted> + 314 14 QuartzCore 0x332eac49 <redacted> + 516 15 IOMobileFramebuffer 0x3606375d <redacted> + 104 16 IOKit 0x31aed451 IODispatchCalloutFromCFMessage + 248 17 CoreFoundation 0x30dc2ef9 <redacted> + 136 18 CoreFoundation 0x30dcdab7 <redacted> + 34 19 CoreFoundation 0x30dcda53 <redacted> + 346 20 CoreFoundation 0x30dcc227 <redacted> + 1398 21 CoreFoundation 0x30d36f0f CFRunLoopRunSpecific + 522 22 CoreFoundation 0x30d36cf3 CFRunLoopRunInMode + 106 23 GraphicsServices 0x35c3b663 GSEventRunModal + 138 24 UIKit 0x3368216d UIApplicationMain + 1136 25 Cellular Radar 0x00077757 main + 70 26 libdyld.dylib 0x3babeab7 <redacted> + 2 ) 2014-04-29 10:47:56.075 Cellular Radar[3226:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI length]: unrecognized selector sent to instance 0x16d007f0' *** First throw call stack: (0x30e02fd3 0x3b5b1ccf 0x30e06967 0x30e05253 0x30d547b8 0x33637ed3 0x337595bb 0x33758031 0x3361ed79 0x3329c62b 0x33297e3b 0x33297ccd 0x332976df 0x332974ef 0x332eac49 0x3606375d 0x31aed451 0x30dc2ef9 0x30dcdab7 0x30dcda53 0x30dcc227 0x30d36f0f 0x30d36cf3 0x35c3b663 0x3368216d 0x77757 0x3babeab7) libc++abi.dylib: terminating with uncaught exception of type NSException 

相关代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; } tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine; tableView.separatorColor = [UIColor lightGrayColor]; UILabel *textLabel = (UILabel*)[cell viewWithTag:kTAG_TITLE]; UILabel *detailTextLabel = (UILabel*)[cell viewWithTag:kTAG_SUBTITLE]; UIImageView *imageView = (UIImageView*)[cell viewWithTag:kTAG_IMAGE]; textLabel.frame = CGRectMake( textLabel.frame.origin.x, textLabel.frame.origin.y - 10, textLabel.frame.size.width, textLabel.frame.size.height ); cell.textLabel.frame = textLabel.frame; cell.tag = indexPath.row; cell.backgroundColor = [UIColor whiteColor]; cell.textLabel.font = cell.detailTextLabel.font = [UIFont fontWithName:kFONT_NAME size:kFONT_SIZE]; imageView.layer.cornerRadius = 10.0; imageView.layer.borderColor = (__bridge CGColorRef)([UIColor clearColor]); imageView.layer.borderWidth = 0; imageView.clipsToBounds = YES; imageView.contentMode = UIViewContentModeScaleAspectFill; textLabel.text = @""; textLabel.textColor = [UIColor darkGrayColor]; textLabel.backgroundColor = [UIColor clearColor]; textLabel.textAlignment = NSTextAlignmentRight; textLabel.font = [UIFont fontWithName:kFONT_NAME size:kFONT_SIZE]; textLabel.textColor = [UIColor darkGrayColor]; detailTextLabel.text = @""; detailTextLabel.font = [UIFont fontWithName:kFONT_NAME size:kFONT_SIZE]; detailTextLabel.backgroundColor = [UIColor clearColor]; detailTextLabel.textAlignment = NSTextAlignmentRight; detailTextLabel.textColor = [UIColor darkGrayColor]; if (self.arrayGlobal.count > 0) { NSDictionary *dict = self.arrayGlobal[indexPath.row]; NSString *imageUrl = dict[@"imageUrl"]; @try { cell.textLabel.text = dict[@"Title"]; } @catch (NSException *exception) { NSLog(@"%s, %@", __PRETTY_FUNCTION__, exception.reason); cell.textLabel.text = @""; } @try { detailTextLabel.text = dict[@"Text"]; } @catch (NSException *exception) { detailTextLabel.text = @""; } if (imageUrl.length > 0) { NSString *completeURL = @""; completeURL = [completeURL stringByAppendingString:kPROFILE_IMAGE_URL]; completeURL = [completeURL stringByAppendingString:@"/2/"]; completeURL = [completeURL stringByAppendingString:imageUrl]; completeURL = [completeURL stringByAppendingString:@".png"]; NSString *fileName = [NSString stringWithFormat:@"%@.png", imageUrl]; NSString* path = GetMediaFolder(); BOOL imageExists = [[NSFileManager defaultManager] fileExistsAtPath:[path stringByAppendingPathComponent:fileName]]; if (imageExists) { dispatch_async(dispatch_get_main_queue(), ^{ UITableViewCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath]; UIImageView *imageView = (UIImageView*)[updateCell viewWithTag:kTAG_IMAGE]; imageView.image=[UIImage imageWithContentsOfFile:[path stringByAppendingPathComponent:fileName]]; imageView.layer.cornerRadius = 23.0; imageView.layer.borderColor = (__bridge CGColorRef)([UIColor clearColor]); imageView.layer.borderWidth = 1.0; imageView.clipsToBounds = YES; imageView.contentMode = UIViewContentModeScaleAspectFill; [updateCell setNeedsLayout]; }); } else { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSURL *imageURL=[NSURL URLWithString:completeURL]; NSData *image=[NSData dataWithContentsOfURL:imageURL]; [image writeToFile:[path stringByAppendingPathComponent:fileName] atomically:YES]; // Update UI dispatch_async(dispatch_get_main_queue(), ^{ UITableViewCell *updateCell = (id)[tableView cellForRowAtIndexPath:indexPath]; UIImageView *imageView = (UIImageView*)[updateCell viewWithTag:kTAG_IMAGE]; imageView.image=[UIImage imageWithContentsOfFile:[path stringByAppendingPathComponent:fileName]]; imageView.layer.cornerRadius = 23.0; imageView.layer.borderColor = (__bridge CGColorRef)([UIColor clearColor]); imageView.layer.borderWidth = 1.0; imageView.clipsToBounds = YES; imageView.contentMode = UIViewContentModeScaleAspectFill; [updateCell setNeedsLayout]; }); }); } } } return cell; } - (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { NSLog(@"4"); @try { cell = [Netroads willDisplayFlatDesignCell:cell]; } @catch (NSException *exception) { NSLog(@"%s, exception.reason: %@", __PRETTY_FUNCTION__, exception.reason); } } + (UITableViewCell*)willDisplayFlatDesignCell:(UITableViewCell*)cell { UILabel *label = [[UILabel alloc] initWithFrame:cell.frame]; label.backgroundColor = [UIColor colorWithRed:200.0/255.0 green:200.0/255.0 blue:200.0/255.0 alpha:1]; // light gray color, native iphone cell.selectedBackgroundView = label; cell.textLabel.backgroundColor = [UIColor clearColor]; cell.textLabel.textAlignment = NSTextAlignmentRight; cell.textLabel.textColor = [UIColor darkGrayColor]; if (cell.detailTextLabel.text) { cell.detailTextLabel.backgroundColor = [UIColor clearColor]; cell.detailTextLabel.textAlignment = NSTextAlignmentRight; cell.detailTextLabel.textColor = [UIColor darkGrayColor]; } return cell; } 

编辑 – 1:

我做了一个日志我的NSDictionary @sleepwalkerfx指出,我的结果暗恋是:

 2014-04-29 12:01:15.182 Cellular Radar[3331:60b] { Date = "22/01/14"; Owner = "\U05de\U05e2\U05e8\U05db\U05ea"; Text = { }; Time = "09:27"; Title = { }; WallID = 1; imageUrl = system; } 

这让我觉得这些对象(文本,标题)如何通过检查作为[NSString class]

您正在将单元格的text属性设置为字典:

 cell.textLabel.text = dict[@"Title"]; 

从你的日志dict

 Title = { }; 

和:

 detailTextLabel.text = dict[@"Text"]; 

从你的日志dict

 Text = { }; 

dict应该使用什么值不清楚,但不应该是那些字典。

原因:NSDictionary没有lengh方法,但是NSString有

改变这一行

  if (imageUrl.length > 0) { 

  if ([imageUrl isKindOfClass:[NSString class]] && imageUrl.length > 0) { 

根据你的日志,你试图访问NSDictionary对象作为NSString 。 这就是为什么会导致上述错误。

问题应该在这里..

  NSString *imageUrl = dict[@"imageUrl"]; 

如果是字典,应该在这一行中崩溃

 if (imageUrl.length > 0) 

在你的tableView:willDisplayCell:forRowAtIndexPath:

检查这一行,

 cell = [Netroads willDisplayFlatDesignCell:cell]; 

这个方法出错了, [Netroads willDisplayFlatDesignCell];

你试图从一个NSDictionary而不是NSArray得到一个length 。 如果您正在从JSON webservice加载数据,可能您正在将NSDictionaryparsing为NSArray 。 修复该方法,那么它不会崩溃。