NSInvalidArgumentException:“无法识别的选择器发送到实例”

时间:2013-12-09 09:44:45

标签: ios objective-c uitableview

我正面临着一个我不能理解原因的问题。这个例外并不能让我了解这个问题。

我想根据myArray中给出的数据在我的界面修改UILabel的内容。但是,作为我在函数“cellForRowAtIndexPath”中指定的行,程序会触发异常。

这个问题的原因是什么?

@property (strong, nonatomic) NSMutableArray *myArray; //

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [myArray addObject:@{@"field1": @"myfield1"}]
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger) section {
    return self.myArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"CellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    // Configure the cell...
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

    UILabel *myLabel = (UILabel *)[cell viewWithTag:100]; // myLabel is successfully created with the given viewWithTag 
    NSLog(@"Object at indexpath.row: %ld", (long)indexPath.row); // Object at indexpath.row: 0
    NSLog(@"The obj of the array = %@",[self.myArray objectAtIndex:indexPath.row] ); // The obj of the array = {field1: @"myfield1"}

    myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"field1"]; // this part fires the exception given below.

    return cell;
}

//getter for myArray
-(NSMutableArray *)myArray{
    if(! _myArray){
        _myArray = [[NSMutableArray alloc] init];
    }
    return _myArray;
}

错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1459d1f0'

4 个答案:

答案 0 :(得分:32)

我不会告诉你改变代码的内容,而是会给你一些指示,这样你就可以在将来更轻松地解决问题了。

首先,您的错误消息是

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFArray objectForKey:]: unrecognized selector sent to instance 0x1459d1f0'

异常消息是此处的关键点

unrecognized selector sent to instance

如果使用您选择的搜索引擎搜索此消息,您将看到这意味着您正在对不响应该方法的对象调用方法。错误消息还会告诉您要尝试调用的方法,以及您调用它的对象类型。

[__NSCFArray objectForKey:]

如果查看NSArray对象的文档,您会发现没有可用的objectForKey方法。

你现在应该做的是在你的代码中设置一个断点(如果你不知道断点,那就去看看它们 - 它们对于调试来说是重要的)并一步一步直到你到达抛出的那一行。例外。此时,您可以检查您拥有的对象并查看其类型。然后,您应该能够弄清楚您应该如何处理编码。

答案 1 :(得分:2)

[__ NSCFArray objectForKey:]:无法识别的选择器发送到实例0x1459d1f0'

您无法为NSMutableArray调用objectForKey 如果你需要使用objectForKey,也许你应该使用NSDictionary: 或者您可以使用数组数组 例如:

NSArray *array = [[NSArray alloc] initWithObjects:@"field1Value",@"field2Value",@"field3Value",nil];

[self.myArray addObject:array];

现在,当您需要检索某些字段值时,只需调用数组中的索引

即可
NSArray *array = [self.myArray objectAtIndex:[indexPath row]];
NSString* valueField1 =[array objectAtIndex:0];

希望这会有所帮助:)

编辑: 如果您需要使用NSDictionary

    self.myArray=[[NSMutableArray alloc]init];
    dict=[[NSDictionary alloc] initWithObjectsAndKeys:@"value",@"KeyName",nil];
    [self.myArray addObject:dict]; 
    myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"KeyName"];

答案 2 :(得分:0)

  

这个例外并不能让我了解这个问题。

我不同意,这个例外告诉你你做错了什么。它告诉您,您已将objectForKey:发送到数组而不是字典。我看到你使用objectForKey:的唯一一行就是这一行。

myLabel.text = [[self.myArray objectAtIndex:indexPath.row] objectForKey:@"field1"]; 

这意味着[self.myArray objectAtIndex:indexPath.row]是一个数组,而不是一个字典。我不知道是怎么发生的,因为你向我们展示的代码中没有任何东西可以向self.myArray添加一个对象。特别是,这不是:

[myArray addObject:@{@"field1": @"myfield1"}]

应该说

[self.myArray addObject:@{@"field1": @"myfield1"}];

我怀疑这只是一个复制错误,因为你也忘记了分号。请注意,在myArray的正面放置下划线并不是很好,因为您依靠访问器初始化数组。

答案 3 :(得分:0)

如果您将NSDictionaryNSMutableDictionary存储到数组,那么代码将适合您。如果要将NSDictionary添加到数组,则应使用:[[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]