从 didSelectRowAtIndexPath 发送到实例的无法识别的选择器
Posted
技术标签:
【中文标题】从 didSelectRowAtIndexPath 发送到实例的无法识别的选择器【英文标题】:unrecognized selector sent to instance from didSelectRowAtIndexPath 【发布时间】:2014-03-17 20:47:19 【问题描述】:我被这个难住了。我的应用程序正在使用核心数据来管理球员和比赛签到。我有两者的课程,并试图在用户从表格视图中选择球员时将球员详细信息添加到比赛中。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Player *selectedPlayer = [self.fetchedResultsController objectAtIndexPath:indexPath];
checkInPlayer.playerFirstName = selectedPlayer.playerFirstName;
checkInPlayer.playerLastName = selectedPlayer.playerLastName;
checkInPlayer.playerImage = selectedPlayer.playerImage;
当我将 checkInPlayer
属性设置为其等效的 selectedPlayer
属性时,我收到了错误。
checkInPlayer
是CheckIn
的一个类,具有以下属性:
@interface CheckIn : NSManagedObject
@property (nonatomic, retain) NSDate * checkInTime;
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;
@property (nonatomic, retain) NSSet *checkInPlayers;
@end
selectedPlayer
是Player
的一个类,具有以下属性:
@interface Player : NSManagedObject
@property (nonatomic, retain) NSString * playerFirstName;
@property (nonatomic, retain) NSString * playerID;
@property (nonatomic, retain) NSString * playerLastName;
@property (nonatomic, retain) NSSet *playerCheckins;
@end
有什么想法吗?
完全错误:
2014-03-17 15:54:17.989 League Manager[2507:60b] -[CheckIn setPlayerFirstName:]: unrecognized selector sent to instance 0x10963b240
2014-03-17 15:54:17.991 League Manager[2507:60b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CheckIn setPlayerFirstName:]: unrecognized selector sent to instance 0x10963b240'
*** First throw call stack:
(
0 CoreFoundation 0x0000000101f3c495 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000101a3c99e objc_exception_throw + 43
2 CoreFoundation 0x0000000101fcd65d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x0000000101f2dd8d ___forwarding___ + 973
4 CoreFoundation 0x0000000101f2d938 _CF_forwarding_prep_0 + 120
5 League Manager 0x000000010000907b -[SelectPlayerTVC tableView:didSelectRowAtIndexPath:] + 379
6 UIKit 0x00000001006b15c2 -[UITableView _selectRowAtIndexPath:animated:scrollPosition:notifyDelegate:] + 1312
7 UIKit 0x00000001006b16eb -[UITableView _userSelectRowAtPendingSelectionIndexPath:] + 221
8 UIKit 0x0000000100602100 _applyBlockToCFArrayCopiedToStack + 316
9 UIKit 0x0000000100601f71 _afterCACommitHandler + 460
10 CoreFoundation 0x0000000101f07dc7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
11 CoreFoundation 0x0000000101f07d37 __CFRunLoopDoObservers + 391
12 CoreFoundation 0x0000000101ee7522 __CFRunLoopRun + 946
13 CoreFoundation 0x0000000101ee6d83 CFRunLoopRunSpecific + 467
14 GraphicsServices 0x0000000103f6df04 GSEventRunModal + 161
15 UIKit 0x00000001005e9e33 UIApplicationMain + 1010
16 League Manager 0x0000000100008433 main + 115
17 libdyld.dylib 0x00000001025d45fd start + 1
18 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
【问题讨论】:
最好能包含 Xcode 显示的完整错误,以便能够查看正在尝试执行的选择器是什么 _fetchedResultsController 是什么类型的对象?它崩溃的代码在哪里?您能否尝试在 selectedPlayer 属性上运行一些日志记录并告诉我们它是否正确。你也有异常断点设置吗? @JJC 做对了。顺便说一句,你有点用这些类和变量名做了自己。 CheckIn 变量应该被称为 checkIn。并且 CheckIn 类可能应该具有 Player 关系,而不是玩家属性的副本。 【参考方案1】:您说您的checkInPlayer
属于CheckIn
类,但您试图访问仅在Player
类中声明的属性。您要么需要在 CheckIn
类中声明这些相同的属性(playerFirstName
等),要么需要将 checkInPlayer
更改为 Player
类的实例。
更清楚地说,它看起来应该更像这样:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Player *selectedPlayer = [self.fetchedResultsController objectAtIndexPath:indexPath];
checkInPlayer.firstName = selectedPlayer.playerFirstName;
checkInPlayer.lastName = selectedPlayer.playerLastName;
// No such property playerImage in the CheckIn class
//checkInPlayer.playerImage = selectedPlayer.playerImage;
【讨论】:
你在那儿开枪@JJC,再次检查问题 请澄清一下?这两个语句“checkInPlayer 是 CheckIn 的一个类”,并且崩溃日志准确地表明了我的意思。 哦,对了,我的错:P你发现了......我开枪了:/ 奇怪,但我没有看到...在我的 tableviewcontroller 头文件中,我声明:@property (nonatomic, strong) CheckIn *checkInPlayer;有趣的是,代码完整提取的是 playerFirstName 而不是 firstName。其他属性也一样... 您可能想要强制重新索引您的代码。不要总是相信代码自动完成:)【参考方案2】:JJC 说的。
'NSInvalidArgumentException',原因:'-[CheckIn setPlayerFirstName:]:
在CheckinClass
中,你设置了playerFirstName
,但是,只有firstName
的属性。
你有:
checkInPlayer.playerFirstName = selectedPlayer.playerFirstName;
应该是:
checkInPlayer.firstName = selectedPlayer.playerFirstName;
【讨论】:
以上是关于从 didSelectRowAtIndexPath 发送到实例的无法识别的选择器的主要内容,如果未能解决你的问题,请参考以下文章
TableView:如何从 didSelectRowAtIndexPath 例程中选择另一行的值
从 didSelectRowAtIndexPath 发送到实例的无法识别的选择器
需要从自定义单元格中的 UITextField 中触发 didSelectRowAtIndexPath
如何从情节提要中的 didSelectRowAtIndexPath 打开视图控制器?
Swift 4.2 - 如何从 tableView 中的“didSelectRowAtIndexPath”方法调用“indexPath.row”到另一个类?