我已经问过这个问题,但也许不够清楚,因为我没有得到任何答复......无论如何,这是我第二次尝试得到答案。
我有一个简单的应用程序,它有2个视图,每个视图都将它在故事板中的类设置为特定的类名。
在主视图中,我有一个列表,显示我的"客户列表#34;现在只是一个电子邮件地址列表。当您单击要转换到第二个视图的电子邮件时,列表中已单击该行的电子邮件。
在ClientDetail视图中,我有一个属性设置来接受名为key的电子邮件地址。假设没有错误,我将文本键分配给UILabel,这样我就可以看到正确的数据被传递了。
确定某些代码的时间。
这是我的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属性。听起来不错吗?我该怎么做?
答案 0 :(得分:1)
看起来您的clients
数组实际上并不包含NSString
,而是NSManageObject
s。您可以通过在[destViewController setKey:...]
之前添加断点并在调试器中运行p (char*)object_getClassName(self.clients[0])
来进行验证。
答案 1 :(得分:0)
这一行:
[destViewController setKey:[self.clients objectAtIndex:indexPath.row]];
传递托管对象本身。如果要传递emailAddress属性,则必须在托管对象上使用valueForKey:
[destViewController setKey:[[self.clients objectAtIndex:indexPath.row] valueForKey:@"emailAddress"];
我认为“钥匙”可能对您的财产来说有点混乱。它与您需要传递给valueForKey的密钥无关:我认为最好将其称为emailAddress或类似描述其代表的内容。