2013-05-21 60 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

你是對的,我在你的帖子之前就想清楚了,但是謝謝,那正是我的問題。 –