尝试将参数传递给 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*) 的无效转换