2014-05-02 91 views
1

當從這樣的childViewController獲得一個UITextView的Text屬性正確鑄造:發送嵌套消息

NSString *text = [((UITextField *)[[childViewController view]viewWithTag:0])text]; 

似乎是罰款和Xcode。 但是,只要應用程序運行並調用方法,我就會得到一個uncaught exception 'NSInvalidArgumentException', reason: '-[UIView text]: unrecognized selector sent to instance 0x89763f0'我認爲我輸入到UITextField的方法有些問題。
我已經嘗試了其他幾種方法來施放它,但他們總是給我Xcode中的錯誤,所以我想這是我最接近解決方案。
有沒有人知道如何正確施放它?
感謝您的幫助!

回答

1

是沒有錯的代碼,除了是難以閱讀(因而維持),然而,你將需要添加一些檢查,看看是否認爲你認爲UITextField實際上是一個:

UITextField *textField = [[childViewController view] viewWithTag:0]; 
NSAssert([textField isKindOfClass:[UITextField class]], @"Oh no! I was wrong"); 
NSString *text = textField.text; 

我建議標籤0是一個糟糕的數字,選擇因爲這是默認的(未設置)值和我預料到斷言火

+0

感謝您的快速回答!是的,事實上它與鑄件沒有任何關係。我搞亂了標籤,所以每次調用該方法時,我都會看到不同的視圖...因此,使用標籤識別視圖對象是一種相當不可靠的方法(如果您在設置時不太謹慎) 。有沒有其他的選擇,比如給他們一個單獨的名字? – Nairam

+0

您應該定義您有興趣在代碼中訪問視圖控制器上的IBOutlet屬性的視圖(通常是文本框,按鈕,標籤等)。 – Taum

+0

嗯,你的意思是過度標籤訪問視圖揭示了應用程序的結構方面的潛在設計問題? – Nairam

0

這與鑄造沒有任何關係。

它實際上與標籤值。默認標籤值爲0,所以如果你這樣做,它不會給UITextField。它可以給你任何意見,你不會設置標籤。

0

以下代碼應該適合您。

NSString *text = nil; 
for (id subview in [childViewController view] subviews]){ 
    if ([subview isKindOfClass:[UITextField class]]){ 
     text = [(UITextField*)subview text]; 
     break; 
    } 
} 

但是,如果要經常訪問視圖的特定子視圖,則應該將其標記設置爲其他回覆中建議的唯一值。