iOS - 名称标签时出现“无法识别的选择器发送到实例”错误

Posted

技术标签:

【中文标题】iOS - 名称标签时出现“无法识别的选择器发送到实例”错误【英文标题】:iOS - "unrecognised selector sent to instance" error, when name label 【发布时间】:2015-12-18 16:37:14 【问题描述】:

当我将表格中的单元格按到另一个视图时,我正在发送一些对象,这些对象必须显示该单元格的详细信息。

当我尝试更改标签(在第二个视图上)文本时,我得到:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'-[UITableViewCell nameOfItem]: 无法识别的选择器发送到实例 0x7f8e7ab5ed40'

我的对象:

@interface Item : NSObject

@property (strong,nonatomic) NSString * nameOfItem;
@property (strong,nonatomic) NSString * descriptionOfItem;
@property (strong,nonatomic) NSString * categoryOfItem;

-(instancetype)initItem:(NSString *)name category:(NSString *)category description:(NSString *)description;
-(NSComparisonResult)compare:(Item *)otherItem;

@end

我的手机:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    NSMutableArray* sortedItems = [[NSMutableArray alloc]initWithArray:[ItemsTable sortItems:self.itemsTable.items]];
    self.itemsTable.items = sortedItems;


    listOfItems = [NSArray arrayWithArray:self.itemsTable.items];
    UITableViewCell *cell;
    NSString *sectionTitle = [[self.itemsTable categoriesOfItemsTable] objectAtIndex:indexPath.section];

    cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
    NSInteger index = [indexPath row];


    cell.textLabel.text = ((Item *)[[self.itemsTable listOfItemsInCategory:sectionTitle] objectAtIndex:index]).nameOfItem;


    return cell;


我的行选择:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    NSString *category = [[self.itemsTable categoriesOfItemsTable] objectAtIndex:indexPath.section];//get category of selected item
    Item *testItem = [[self.itemsTable listOfItemsInCategory:category] objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"IntoInfoPage" sender:testItem];

我为转会做准备:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    ...

    if ([segue.identifier isEqualToString:@"IntoInfoPage"])
        if ([segue.destinationViewController isKindOfClass:[InfoViewController class]])
            InfoViewController *fivc = (InfoViewController *)segue.destinationViewController;
            fivc.gotchaItem = sender;
        
    

我的第二个观点:

@interface InfoViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameOfFullInfoItem;
@property (weak, nonatomic) IBOutlet UILabel *categoryOfFullInfoItem;
@property (weak, nonatomic) IBOutlet UITextView *descriptionOfFullInfoItem;

@end

@implementation InfoViewController

- (void)viewDidLoad 
    [super viewDidLoad];

    if (self.gotchaItem)
    
        self.nameOfFullInfoItem.text = [NSString stringWithFormat:@"Name: %@",self.gotchaItem.nameOfItem];
        self.categoryOfFullInfoItem.text = [NSString stringWithFormat:@"Category: %@",self.gotchaItem.categoryOfItem];
        self.descriptionOfFullInfoItem.text = [NSString stringWithFormat:@"%@",self.gotchaItem.descriptionOfItem];
    



- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

异常出现在行,这是我的第二个视图:

#import "InfoViewController.h"

@interface InfoViewController ()
@property (weak, nonatomic) IBOutlet UILabel *nameOfFullInfoItem; //Here!
@property (weak, nonatomic) IBOutlet UILabel *categoryOfFullInfoItem;
@property (weak, nonatomic) IBOutlet UITextView *descriptionOfFullInfoItem;

@end

【问题讨论】:

什么是self.gotchaItem? @Mr.T,在第二个视图的标题中 // // InfoViewController.h // ItemsMarket // // Created by Maxim on 12/18/15. // Copyright © 2015 Maxim. All rights reserved. // #import "TableViewController.h" #import "Item.h" @interface InfoViewController : TableViewController @property (strong,nonatomic) Item* gotchaItem; @end @Mr.T 这是我的对象,我发送到我的第二个视图 不,该行没有发生异常。崩溃将发生在您的一种方法中。 您最初在问题中发布的异常表明它正在调用nameOfItem。此外,应用不会因属性声明而崩溃。 【参考方案1】:

错误是告诉您您正在对UITableViewCell 调用nameOfItem 方法。仅此一项就足够了,但您也有堆栈跟踪,追踪它应该不难。

在您附加的代码中,这是非常可疑的:

cell.textLabel.text = ((Item *)[[self.itemsTable listOfItemsInCategory:sectionTitle] objectAtIndex:index]).nameOfItem;

在该行设置断点并确保它是Item 而不是UITableViewCell

【讨论】:

我已经检查过了。它是一个项目,它不是一个 UITableview,它是我的主视图控制器。我的应用程序在线崩溃(我的第二个视图的属性):'@property (weak, nonatomic) IBOutlet UILabel *nameOfFullInfoItem;'【参考方案2】:

您的应用程序正在以下行崩溃

 self.nameOfFullInfoItem.text = [NSString stringWithFormat:@"Name: %@",self.gotchaItem.nameOfItem];

这里 self.gotchaItem 似乎是一个 UITableViewCell。这就是为什么您不能从此对象调用 nameOfItem 的原因。确保您发送正确的项目对象,并且 self.gotchaItem 应该是 Item 类的对象。

【讨论】:

为什么是-1?您应该就此事发表评论。 1) 自投反对票以来,您完全改变了答案。 2)即使是新的答案也是错误的。如果self.gotchItem 实际上是UITableViewCell,则使用强制转换不会解决问题。它仍然会崩溃。 3)你怎么知道那是崩溃的线? OP 仍然没有告诉我们它实际崩溃的位置。 您是否阅读了错误信息?它说“[UITableViewCell nameOfItem]:无法识别的选择器发送到..”所以,据我所知,我知道它在访问 nameOfItem 的行中崩溃了。我在两个不同类型的地方发现了这一点。列表视图控制器中的一个,其中 OP 从 self.itemsTable 获取项目。 OP 在评论中说它在 infoviewcontroller 上出现问题,而不是第一个。所以,请在投票前阅读每条评论。 这并不能改变您的答案是错误的事实。简单地添加演员表并不能解决崩溃问题。 你读过这个吗? “当我将表格中的单元格按到另一个视图时,我正在发送一些对象,它必须显示该单元格的详细信息。当我尝试更改标签(在第二个视图上)文本时,我得到:“不要您认为 OP 已经清楚地说明了崩溃发生在哪里?在我的回答中,请阅读最后一行“并确保您发送正确的项目对象。”所以,请停止争论,如果您真的可以帮助OP,请在不浪费时间的情况下给出答案。【参考方案3】:

起初我会同意其他答案,但你说你的对象是一个项目,所以它让我想到了这个答案:

您是否检查过此插座@property (weak, nonatomic) IBOutlet UILabel *nameOfFullInfoItem; 是否正确连接到 UILabel?进入您的界面生成器并确认只有这个标签连接到这个插座,没有其他任何东西。

【讨论】:

以上是关于iOS - 名称标签时出现“无法识别的选择器发送到实例”错误的主要内容,如果未能解决你的问题,请参考以下文章

单击本地通知时出现 Google FCM ios-quickstart 错误 - 无法识别的选择器已发送到实例

使用 UILocalizedIndexedCollat​​ion 在 Swift 4.2 中创建 tableView 部分索引时出现错误“无法识别的选择器发送到实例”

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

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

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

[NSCFArray 长度]:发送到实例的无法识别的选择器