我正面临着一个我不能理解原因的问题。这个例外并不能让我了解这个问题。
我想根据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'
答案 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)
如果您将NSDictionary
或NSMutableDictionary
存储到数组,那么代码将适合您。如果要将NSDictionary添加到数组,则应使用:[[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]