2011-08-08 29 views
2

我知道這很簡單,這就是爲什麼我一直在試圖自己想出來,但我在我的繩索結束。可可:從一個單獨的類獲取方法的返回值

當用戶點擊一個按鈕的操作是應該做到這一點:

- (IBAction)startAction:(id)sender { 
MyClass *anInstance = [[MyClass alloc] init]; 
NSLog(@"the name is:%@", [anInstance name]); 

正如你可以看到,MyClass的有「名」的方法,它是這樣的:

- (NSString *)name { 
return [nameInput stringValue]; 
NSLog(@"stringValue = %@", [nameInput stringValue]); 

nameInput是用戶填充名稱的文本字段,按下按鈕調用「startAction」,該方法應在另一個類中調用「name」,該類應從文本字段返回字符串值並創建日誌。

實際發生的事情是,當按下開始時,日誌會顯示「名稱是:(空)」。而第二個日誌甚至沒有出現。我認爲這是因爲「名稱」方法沒有被調用。但我不知道爲什麼。我應該指定,他們是在不同的班級,我宣佈這樣的「名」的方法:

- (NSString*)name; 

編輯:經過我身邊多一點嘴硬發現,當「名」的方法會從它自己的類中調用,日誌正確顯示了文本字段中的內容。我在「name」方法中加入了一個額外的日誌,並且我可以看到它從另一個類中調用,但是它返回的值仍然爲(null),這意味着在調用之後發生了阻止從獲取文本字段字符串的類。

編輯:我不知道這是否重要,但其中一個類是NSObject的子類,另一個是NSViewController的子類。

如果您需要更多信息,請告知我。 感謝您的幫助。

回答

3

name方法中,您不能在NSLog()命令之前返回值 - 從方法返回是方法中發生的最後一件事(我很驚訝您沒有收到有關NSLog()的警告函數沒有被調用)。試試這個:

- (NSString *)name { 
    NSLog(@"stringValue = %@", [nameInput stringValue]); 
    return [nameInput stringValue]; 
} 

至於爲什麼nameInput沒有價值,我猜你沒有正確正確地在Interface Builder連接文本字段。

+0

修復順序現在使它們都出現,但它們仍然只顯示(空),即使再次鏈接它之後 – Elbimio

2

我不確定這是否是正確答案,因爲您尚未完全說明nameInput的來源以及它的價值。但我猜這是一個MyClass的實例變量。在startAction:中,您將創建MyClass的新實例。 MyClassinit方法是否也初始化nameInput?由於alloc initializes the instance variables to nil(或00.0,...取決於類型),如果你的init方法沒有任何其他的值賦給nameInput,它仍然是nil在點時startAction:發送nameMyClass實例。在大多數情況下,在Objective-C中向nil發送消息返回nil(*),因此在此情況下,發送stringValuenameInput將返回nil,因此您會在日誌中獲得(null)輸出。

(*)欲瞭解更多信息,請參閱my answer to the question "Sending a message to nil?"

+0

這是有道理的。 nameInput是一個文本字段,值來自用戶輸入。我在init方法中添加了[nameInput init],但它仍然不起作用。 – Elbimio

+1

如果這一行是你添加的,它只是將'init'發送給'nil'。您可能希望(重新)閱讀Xcode關於「分配和初始化對象」的文檔。如果您不是,那麼我並不意味着冒犯,但它看起來像是一個開始(Objective-C)程序員。我強烈建議你先學習Smalltalk。學習起來更容易,而且Objective-C很大程度上依賴於它,所以稍後可以輕鬆應對Objective-C的額外複雜性。一個好的起點是Pharo的「立即開始」下載:http://www.pharo-project.org/ – Rinzwind

0

- (NSString *)name { 
return [nameInput stringValue]; 
NSLog(@"stringValue = %@", [nameInput stringValue]); 

屬於

MyClass *anInstance = [[MyClass alloc] init]; 

爲了這,我相信,nameInput是不是它的一部分。

可能嘗試添加一個文本框參數名稱方法和你nameInput傳遞給MyClass的像

- (IBAction)startAction:(id)sender { 
MyClass *anInstance = [[MyClass alloc] init]; 
NSLog(@"the name is:%@", [anInstance name:nameInput]); 

希望這有助於。

相關問題