【问题标题】:Invalid selector sent to instance发送到实例的无效选择器
【发布时间】:2012-03-29 01:08:49
【问题描述】:

我正在为教师创建一个应用程序,用于存储课程和学生以及跟踪成绩。现在它设置在一个数据模型中,该模型将课程存储在一个数组中。课程是包含一系列学生和作业的对象。我有一个转换为学生表视图的所有课程的表视图。在课程详细信息视图中,我有一个表格视图单元格,它转换到作业的第三个表格视图。我的问题发生在这里。当我尝试向 tableview 添加分配时,出现错误:'NSInvalidArgumentException',原因:'-[__NSArrayI addObject:]: unrecognized selector sent to instance 0x6b38620'..

这是一些我认为可能包含问题的代码。

课程详情视图控制器:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"AssignmentTable"]) {

    AssignmentViewController *controller = segue.destinationViewController;
    controller.checklist = checklistToEdit;

}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(indexPath.row == 2)
    {
    [self performSegueWithIdentifier:@"AssignmentTable" sender:checklistToEdit];


    }
}

分配视图控制器:

- (void)editAssignmentViewController:(EditAssignmentViewController *)controller     didFinishAddingItem:(Assignment *)item
{
int newRowIndex = [self.checklist.assignments count];

[self.checklist.assignments addObject:item];

NSIndexPath *indexPath = [NSIndexPath indexPathForRow:newRowIndex inSection:0];
NSArray *indexPaths = [NSArray arrayWithObject:indexPath];
[self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationAutomatic];


[self dismissViewControllerAnimated:YES completion:nil];
}

分配细节视图控制器:

- (IBAction)done
{
if (assnToEdit == nil) {
    Assignment *item = [[Assignment alloc] init];
    item.texta = self.textFielda.text;

    [self.delegate editAssignmentViewController:self didFinishAddingItem:item];


} else {
    self.assnToEdit.texta = self.textFielda.text;

    [self.delegate editAssignmentViewControllerDidCancel:self]; 
}

}

【问题讨论】:

  • 如何声明和创建在[self.checklist.assignments addObject:item]; 中使用的 assignments 对象?
  • “Assignment”对象被声明和构造为一个包含两个字符串和一个 ID 的类。作业数组被声明为 NSMutable 数组,作为 Course 对象的一部分。
  • 初始化 assignments 数组的代码是什么样的?我还建议通过逐步调试代码来验证是哪一行导致了错误。我假设这是我上面引用的那个,因为这是您显示“addObject”的唯一地方,但很高兴知道这一点。

标签: objective-c


【解决方案1】:

您存储在assignments 属性中的对象是NSArray 的一个实例,它是不可变的。您需要将其作为 NSMutableArray 的实例。这就是addObject: 是一个无法识别的选择器的原因——它是一种存在于NSMutableArray 但不存在于NSArray 中的方法,并且您的代码将其发送到NSArray 的一个实例。

【讨论】:

  • 看,但我已经声明'assignments'是一个 NSMutable 数组。我觉得也许我不明白你想告诉我什么。我试图在作业中存储的对象只是一个对象。为什么我已经声明并初始化为 NSMutable 数组的数组不接受它。
  • @user1170015 assignments 是一个包含数组的属性。在您的程序中的某个时刻,您必须在assignments 属性中存储一个数组,否则它的值将为零。您用来设置属性值的对象是NSArray 的一个实例。您很可能忽略了一个编译器警告,否则该警告会提醒您该问题。
猜你喜欢
  • 1970-01-01
  • 2019-08-28
  • 2012-07-24
相关资源
最近更新 更多