从 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 属性时,我收到了错误。

checkInPlayerCheckIn 的一个类,具有以下属性:

@interface CheckIn : NSManagedObject

@property (nonatomic, retain) NSDate * checkInTime;
@property (nonatomic, retain) NSString * firstName;
@property (nonatomic, retain) NSString * lastName;
@property (nonatomic, retain) NSSet *checkInPlayers;
@end

selectedPlayerPlayer 的一个类,具有以下属性:

@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”到另一个类?

如何从调用方法didSelectRowAtIndexPath将数据传递给ios应用程序中的子视图控制器