无法识别的选择器发送到实例 - 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]:无法识别的选择器发送到实例