无法识别的选择器发送到实例 - UITableView 和 Restkit LoadObjects 选项

Posted

技术标签:

【中文标题】无法识别的选择器发送到实例 - UITableView 和 Restkit LoadObjects 选项【英文标题】:Unrecognized Selector Sent to Instance - UITableView and Restkit LoadObjects Options 【发布时间】:2012-03-24 00:24:21 【问题描述】:

我在 restkit google 小组中问过这个问题,但现在意识到它实际上可能是一个更广泛的问题,而不是 RK 特定的问题。

我在这个问题上绕了几个小时。我正在尝试使用从 Web 服务检索并使用 RestKits 对象映射存储在对象中的数据填充 UITableView。点击服务,存储对象都很好。

问题是当我尝试为表重新加载数据时。我收到此错误 -

'NSInvalidArgumentException', reason: '-[CoursesModel text]: unrecognized selector sent to instance and then app shuts down and 

takes me here: 
@autoreleasepool  
return UIApplicationMain(argc, argv, nil, 
NSStringFromClass([RoundShoutAppDelegate class])); 
 
Thread 1: signal SIGABRT 

CoursesModel 是我设置的模型。如果我没有将 tableview 的委托指定为类(我知道我必须这样做),那么课程会在 table view 中完美加载。但是当我尝试单击其中一个单元格时会出现错误(在 didSelectRowAtIndexPath 处。所以专注于 事实上,我必须指定一个代表,我知道有些事情真的搞砸了,我想不通。

我假设某些东西在不应该发布的时候被释放了,但是数据在 _courses 数组中。顺便说一下,这是一个 ARC 项目。

这里是一些相关的代码,但如果您需要更多,请告诉我。如果有人有任何信息可以为我指明正确的方向,那就太棒了!谢谢你的帮助!

MainViewController.h 
@interface MainViewController : UITableViewController <CLLocationManagerDelegate, RKObjectLoaderDelegate, UITableViewDelegate, UITableViewDataSource>  
IBOutlet UITableView *coursesTableView; 
NSArray *_courses; 
 

@end 

CoursesModel.h

@interface CoursesModel : NSObject  
NSNumber* _courseID; 
NSString* _courseName; 
NSString* _city; 
NSString* _state; 
NSNumber* _distance; 
 

@property (nonatomic, retain) NSNumber* courseID; 
@property (nonatomic, retain) NSString* courseName; 
@property (nonatomic, retain) NSString* city; 
@property (nonatomic, retain) NSString* state; 
@property (nonatomic, retain) NSNumber* distance; 
@end 

MainViewController.m

//Most of the code ommited for your sanity 
// All good up to this point 
- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects: 
(NSArray*)objects  
 //NSLog(@"Loaded courses %@", objects); 
_courses = objects; 
// There is data in _courses. 
NSLog(@"Loaded courses in array %@", _courses); 
[coursesTableView reloadData]; 

委托方法:

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  CGSize size = [[[_courses objectAtIndex:indexPath.row] text] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(300, 9000)]; 
return size.height + 10; 

【问题讨论】:

某事正在调用名为 -text 的方法,发布该方法(如果存在)或调用者。 据我在代码中所知,这里是唯一直接引用“文本”的地方 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath CGSize size = [[[_courses objectAtIndex:indexPath.row] text] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(300, 9000)];返回尺寸.高度 + 10; --- 但是,我将其注释掉并返回 50 进行测试,但错误仍然存​​在。所以我猜这不是 @CodaFi - 感谢您为我调查此问题。如果您需要更多代码,请告诉我。我在猜测代码 sn-p 不是您正在寻找的“文本”参考,所以我很乐意在其他地方挖掘。再次感谢! 【参考方案1】:

我现在看到了!你的委托方法

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  

CGSize size = [[[_courses objectAtIndex:indexPath.row] text] sizeWithFont:[UIFont systemFontOfSize:14] constrainedToSize:CGSizeMake(300, 9000)]; 

return size.height + 10; 


错了。 NSArray 没有名为 -text 的方法,因此它会导致将无法识别的选择器发送到 NSArray。为什么编译器没有对此发出警告?如果需要字符串,请使用-stringValue

至于您的委托,现在这完全有意义,因为不设置委托不会在重新加载时调用此方法。

【讨论】:

首先,感谢您的建议(并将我的帖子修复为正确的格式)。我按照您的建议更改了代表。但现在错误是:*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CoursesModel stringValue]: unrecognized selector sent to instance 我感觉有些东西正在被释放,但我很困惑,因为 _courses 数组被填充。如果你有更多的魔法,我会全力以赴!再次感谢! 这不是....那么去掉stringValue,只是objectAtIndex...它应该可能会崩溃,只需发布​​错误。 给你。正如您预期的那样崩溃:***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[CoursesModel sizeWithFont:constrainedToSize:]:无法识别的选择器已发送到实例 我发誓,_courses 不是 NSArray*...您以某种方式将此消息发送给一个类,而不是数组本身,这就是所有这些崩溃发生的原因。如果要访问另一个类中的 var,它必须是 @property。 哇。你是个天才。我曾想知道这一点。我设置 NSArray *_courses;在@界面中。我填充了 _courses 并在日志中看到了它,所以我认为我很好。根据您的建议,我添加了属性(强,保留) NSArray *courses;并合成它和Boom!有用。高度似乎不起作用,但这是一个小问题,我可以弄清楚(我希望)。非常感谢你帮助我!

以上是关于无法识别的选择器发送到实例 - UITableView 和 Restkit LoadObjects 选项的主要内容,如果未能解决你的问题,请参考以下文章

[UICollectionViewCell imageView]:无法识别的选择器发送到实例

UISwipeGesture '发送到实例的无法识别的选择器'

无法识别的选择器发送到实例

无法识别的选择器发送到数组中的实例[重复]

无法识别的选择器发送到实例 Objective-C

无法识别的选择器发送到实例