0

我已经问过这个问题,但可能不够清楚,因为我没有得到任何答复……无论如何,这是我第二次尝试得到答案。

我有一个简单的应用程序,它有 2 个视图,每个视图都有它的类在情节提要中设置为特定的类名。

  1. 主视图(MainViewController)
  2. 客户端详细视图(客户端详细视图控制器)

在主视图中,我有一个列表,其中显示了我的“客户”列表,现在它只是一个电子邮件地址列表。当您单击电子邮件时,我想使用列表中单击的行的电子邮件转换到第二个视图。

在 ClientDetail 视图中,我有一个属性设置来接受名为 key 的电子邮件地址。假设没有错误,我将 Text 的键分配给 UILabel,这样我就可以看到传递了正确的数据。

OK 是时候写一些代码了。

这是我的 prepareForSegue 方法,你可以看到一些评论,因为我一直在尝试不同的东西......

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showClientDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        ClientDetailViewController *destViewController = (ClientDetailViewController *)segue.destinationViewController;
        //destViewController.key = [self.clients objectAtIndex:indexPath.row];
        [destViewController setKey:[self.clients objectAtIndex:indexPath.row]];
    }
}

这是抛出异常时得到的输出

2013-05-21 13:56:50.484 ClientManager[19728:11603] -[NSManagedObject isEqualToString:]: unrecognized selector sent to instance 0x8624f90
2013-05-21 13:56:50.485 ClientManager[19728:11603] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSManagedObject isEqualToString:]: unrecognized selector sent to instance 0x8624f90'
*** First throw call stack:
(0x1fa4012 0x13e1e7e 0x202f4bd 0x1f93bbc 0x1f9394e 0x1764af 0x176674 0x5871 0xfe817 0xfe882 0xfeb2a 0x115ef5 0x115fdb 0x116286 0x116381 0x116eab 0x1174a3 0x117098 0x472da3 0x464ad9 0x464b54 0xcc899 0xccb3d 0xad3e83 0x1f63376 0x1f62e06 0x1f4aa82 0x1f49f44 0x1f49e1b 0x1efe7e3 0x1efe668 0x1d65c 0x1e2d 0x1d55)
libc++abi.dylib: terminate called throwing an exception

我已经阅读并重新阅读了教程,堆栈跟踪,但我无法弄清楚。我是 iOS 开发的新手,非常感谢专家的帮助。

如果我没有发布足够的信息请不要对我的帖子投反对票或侮辱我,就像我说我是新手一样,所以让我知道我可以添加什么可以帮助解决问题。

谢谢

- - - - - - -更新 - - - - - - - -

好的所以经过一些建议后,我在调试器中运行了它

p (char*)object_getClassName(self.clients[0])

看起来问题的一部分是,当我调用 setKey 时,我引用了一个对象 NSManagedObjec_Client,所以现在它为什么失败是有道理的。

从这里我不确定如何获取对象的属性来设置密钥。

这是我在 MainViewController.m 中的内容

@property (strong) NSMutableArray *clients;

- (void)viewDidLoad
{
    [super viewDidLoad];

        // Fetch the devices from persistent data store
    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Client"];
    self.clients = [[managedObjectContext executeFetchRequest:fetchRequest error:nil] mutableCopy];

    [self.tableView reloadData];

}

因此,基于此,我假设我需要以某种方式强制转换 NSManagedObject_Client_ 并获取 emailAddress 属性。听起来对吗?我该怎么做?

4

2 回答 2

1

看起来您的clients数组实际上并不包含NSStrings,而是NSManageObjects。您可以通过在调试器之前添加断点并在调试器中[destViewController setKey:...]运行来进行验证。p (char*)object_getClassName(self.clients[0])

于 2013-05-21T21:19:22.860 回答
0

这一行:

[destViewController setKey:[self.clients objectAtIndex:indexPath.row]];

传递托管对象本身。如果要传递 emailAddress 属性,则必须在托管对象上使用 valueForKey:

[destViewController setKey:[[self.clients objectAtIndex:indexPath.row] valueForKey:@"emailAddress"];

我认为“钥匙”对于您的财产来说可能是一个有点令人困惑的名称。它与您需要传递给 valueForKey: 的密钥无关。我认为最好将其称为 emailAddress 或类似的描述它所代表的内容。

于 2013-05-21T21:51:53.970 回答