尝试将参数传递给 void 时由无法识别的选择器导致的错误

Posted

技术标签:

【中文标题】尝试将参数传递给 void 时由无法识别的选择器导致的错误【英文标题】:Error caused by unrecognized selector while trying to pass an argument to a void 【发布时间】:2015-07-01 11:38:25 【问题描述】:

感谢 Stack 的开发人员,我能够发现我之前的问题的根源,该问题出现在我的应用程序的不同文件中(因此我正在写一篇新帖子)。

我正在尝试编写一个有趣的聊天应用程序,我编写了一个自定义视图类来显示所有发送和接收的消息。我在我的主视图控制器中使用viewWithTag 在以下代码行中调用这个类:MessageView *messageView = (MessageView *)[cell viewWithTag:MESSAGE_VIEW_TAG];。 MessageView 类有一个名为 transcript 的属性,它包含消息的所有信息。我还在我的主视图控制器中设置了 MessageView 类的成绩单属性。但是,我在MessageView 的实现文件中使用它时遇到了麻烦。

我收到错误Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITableViewCell setTranscript:]: unrecognized selector sent to instance 0x7fc77afe1070',我不太明白...这是我的 setTranscript 方法(不要阅读所有内容,我假设错误仅来自第一行)。

- (void)setTranscript:(Transcript *)transcript

// Set the message text
NSString *messageText = transcript.message;
_messageLabel.text = messageText;

// Compute message size and frames
CGSize labelSize = [MessageView labelSizeForString:messageText fontSize:MESSAGE_FONT_SIZE];
CGSize balloonSize = [MessageView balloonSizeForLabelSize:labelSize];
NSString *nameText = transcript.peerID;
CGSize nameSize = [MessageView labelSizeForString:nameText fontSize:NAME_FONT_SIZE];

// Comput the X,Y origin offsets
CGFloat xOffsetLabel;
CGFloat xOffsetBalloon;
CGFloat yOffset;

if ([transcript.direction isEqualToString:@"right"]) 
    // Sent messages appear or right of view
    xOffsetLabel = 320 - labelSize.width - (BALLOON_WIDTH_PADDING / 2) - 3;
    xOffsetBalloon = 320 - balloonSize.width;
    yOffset = BUFFER_WHITE_SPACE / 2;
    _nameLabel.text = @"";
    // Set text color
    _messageLabel.textColor = [UIColor whiteColor];
    // Set resizeable image
    _balloonView.image = [self.balloonImageRight resizableImageWithCapInsets:_balloonInsetsRight];


从我在调试器区域收到的警报消息中,我假设我的标题中没有正确定义脚本(我在实现中小心地导入了它)。所以这是我的头文件的样子:

#import <UIKit/UIKit.h>
#import "Transcript.h"
@class Transcript;
#define MESSAGE_VIEW_TAG (99)
@interface MessageView : UIView
@property (nonatomic, strong) Transcript *transcript;
@end

有谁知道我为什么会收到此错误消息?我的论点有什么问题,成绩单?非常感谢您!

【问题讨论】:

How can I debug 'unrecognized selector sent to instance' error 的可能重复项 您尝试在UITableViewCell object 上调用setTranscript: 代码中的某处:在您的cellForRowAtIndexPath: 中可能吗? 了解如何获取异常堆栈跟踪。没有它你就瞎了。 【参考方案1】:

您似乎有一个自定义的 tableview 单元格,您在其中编写了一个属性 Transcript,该属性具有一个 setter setTranscript。

看来您在 cellForRowAtIndexPath 中的 dequeueReusableCellWithIdentifier 方法正在返回 UITableViewCell 而不是您的自定义单元格。

所以尝试在表格视图中为单元格设置一个标识符,并在 cellForRowAtIndexPath 中检索具有相同标识符的单元格。

【讨论】:

【参考方案2】:

看起来你在 UITableViewCell 中调用 setter,但应该在 MessageView 中调用。 你能显示用于调用“setTranscript”的代码吗?

【讨论】:

我从不在 UITableView 中调用 setTranscript 方法。相反,我写了MessageView *messageView = (MessageView *)[cell viewWithTag:MESSAGE_VIEW_TAG]; 对不起,我是说 UITableViewCell。 确定 [cell viewWithTag:MESSAGE_VIEW_TAG] 真的返回 MessageView 吗? MESSAGE_VIEW_TAG 指向 MessageView 类,所以我想是的 在 [cell viewWithTag:MESSAGE_VIEW_TAG] 处设置断点并打印以记录单元格的子视图。你在故事板中设置了正确的标签吗?

以上是关于尝试将参数传递给 void 时由无法识别的选择器导致的错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试关闭键盘时出现“无法识别的选择器”错误

尝试将参数传递给点击手势的方法

将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

.Net 将对象列表作为参数传递给 JQuery

我应该将啥对象传递给需要 Void 的函数!在参数中? (科特林)

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