2013-05-21 62 views
0

我已经问过这个问题,但可能不够清楚,因为我没有得到任何答复......无论如何,这里是我第二次尝试获得答案。通过prepareForSegue传递信息的问题,我无法弄清楚

我有一个简单的应用程序有2个视图,每个视图都有它在故事板中设置为特定类名称的类。

  1. 主视图(MainViewController)
  2. ClientDetailView(ClientDetailViewController)

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

在ClientDetail视图中,我有一个属性设置来接受名为key的电子邮件地址。假设没有错误,我将文本的键分配给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开发很新,并且非常感谢专家的帮助。

如果我还没有发布足够的信息请不要投我的帖子或侮辱我,就像我说我是新来的,所以让我知道我可以补充,可以帮助解决方案。

感谢

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

OK所以经过一些意见,我跑这在调试

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

它看起来像的部分问题是,当我打电话的setkey我referenceing对象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

不要再次询问问题,您应该通过点击问题底部标签下方的“编辑”来编辑您的原始问题和更新的信息。这里强烈建议不要重复提问,因为它们会创建冗余信息,这样可以更好地保存在一个地方。请删除您的其中一个问题,否则他们很可能会被社区重复关闭! :) – lnafziger

+0

至于你的问题,确定哪一行导致错误。我在猜测它是在你的'ClientDetailView'类中的方法setKey或其他东西中,而在这里你的segue没有。 – lnafziger

+0

如何在ClientDetailController中声明密钥?如果你已经重写了该属性的setter,那么你也应该显示这个代码。 – rdelmar

回答

1

它看起来像你的clients阵列并不包含NSString s,但是NSManageObject s。您可以通过在[destViewController setKey:...]之前添加一个断点并在调试器中运行p (char*)object_getClassName(self.clients[0])来进行验证。

+0

你是正确的,当我运行该命令我得到(char *)$ 2 = 0x112576c0“NSManagedObject_Client_”不知道从哪里走,虽然 –

+0

好吧,我想出了你的感谢......我需要获得对象的keyValue而不是对象本身。 NSManagedObject * client = [self.clients objectAtIndex:indexPath.row]; NSString * email = [client valueForKey:@“emailAddress”]; [destViewController setKey:email]; –

+0

@JeremyRagsdale很高兴能帮到你! – Mar0ux

0

这条线:

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

传递管理对象本身。如果你想通过EMAILADDRESS属性,那么你必须使用valueForKey被管理对象:

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

我觉得“键”可能是自己财产的有点混乱的名称。它与您需要传递给valueForKey的键无关。我认为将它称为emailAddress或类似描述它代表的内容会更好。

+0

你是对的,我在你的帖子之前就想清楚了,但是谢谢,那正是我的问题。 –