2009-11-01 39 views
0

如何獲取對象的文本值以便將其顯示在表中?其他職位說對象不是NSString,你需要問對象的文本。但是如何?該錯誤是這樣的:如何獲取對象的文本值?

*終止應用程序由於未捕獲的異常 'NSInvalidArgumentException',原因是: '* - [名isEqualToString:]:無法識別的選擇發送到實例0xf51b60'

此代碼在Objective-C:

NSString *cellValue = [namesArray objectAtIndex:indexPath.row]; 
cell.textLabel.text = cellValue; 
return cell; 

我對不住你先進的編程人員,我在這個新的和無法要麼找到NSObject的文檔中的答案。謝謝。

+0

對象的類型是什麼?對象沒有規範的「文本價值」,因此多種方法可能適合該法案。一個常見的是'-stringValue'。 – outis 2009-11-01 18:57:14

+0

另一個是'-description'。 – outis 2009-11-01 18:58:23

+0

@outis:不,常見的是'-description',它在'NSObject'中實現,並且通常會覆蓋哪些類。它返回一個字符串。 – jbrennan 2009-11-01 18:59:46

回答

0

如果要顯示NSLog()"%@"格式的對象,則調用的方法是-(NSString*) description(如果存在)。您有責任爲您自己的課程編寫此方法。

+0

謝謝。將嘗試並看看會發生什麼。 – Doug 2009-11-09 03:29:30

3

您可以使用-description方法來獲取任何對象的字符串值,類似於Java中的toString()。許多課程也對-stringValue方法做出響應。

但是,-description主要用於調試目的。如果您發佈的代碼不起作用,那意味着namesArray包含NSString實例以外的其他內容,在這種情況下,您需要了解陣列中的對象類型;你不能只將一個對象投射到NSString。

+0

最初,代碼在代碼中有字符串名稱時起作用,並且它們在表格中正確顯示。但是我現在已經刪除了字符串名稱,並試圖在用戶輸入名稱的地方使用CoreData,它們被保存,提取並顯示在表格中。是的,namesArray應該包含字符串,所以也許它的CoreData問題還沒有工作,或者我需要一個stringValue方法。 – Doug 2009-11-09 03:16:35

+0

根據錯誤消息,您有一個名爲「Names」的類,您將其視爲字符串,因此會出現錯誤。 – Darren 2009-11-09 19:00:13

2

我覺得迄今爲止的答案都沒有提到這個問題。您的錯誤是說Names類不執行isEqualToString:方法。這被稱爲(推測是),因爲UITableViewCell只改變其textLabeltext,如果該字符串與正在顯示的字符串不同,並且它使用isEqualToString:執行此比較,因爲cell.textLabel.textNSString屬性。

但是,你沒有給它NSString。你給它一個Names對象,所以當然這不起作用。由於Names顯然是一個自定義對象,因此您必須提供一種方法從該對象中提取字符串表示形式,並且您必須明確調用該方法。

例如,你可能會實現一個叫做-asString方法(這將是一個可怕的名字,但這是爲了說明一點),這可能是這個樣子:

- (NSString*) asString { 
    return [NSString stringWithFormat:@"This name is %@", aNameIvar]; 
} 

你可以這樣使用它像這樣:

Name * thisName = [namesArray objectAtIndex:indexPath.row]; 
cell.textLabel.text = [thisName asString]; 
return cell; 

該方法的專有名稱是-stringValue-stringValue使用幾個Cocoa對象返回它們保存數據的字符串表示,如NSNumberNSCell(MAC)等

編輯:

彼得Hosey在this StackOverflow.com很巧妙地回答了這個問題詢問題。

+0

在發佈之前,我確實看到了Peter Hosey的回答。非常類似的情況,但當他的回答是「向對象索取文本」時,我被絆倒了。我會嘗試你的建議爲-stringValue方法,看看是否有效。謝謝。另見我對達倫的迴應;這用於在我專門定義字符串時工作,但現在我試圖改用CoreData。 – Doug 2009-11-09 03:28:28