2010-03-07 68 views
0

我的代碼中有幾個不同的類使用相同的方法 - 導致很多重複的行 - 我最近發現了有關添加類別的承諾有效解決問題的類別。爲了讓中較小的一個例子,我以前的方法是(通常)被稱爲傳統的方式是這樣的:從NSTextField類別內訪問視圖?

if((thisNum=[self valueInTextField:ctr]) != 0) 
    //... do stuff here... 

- (int)valueInTextField:(int)tagNum 
{ 
    NSTextField *field = [[prizeWindow contentView] viewWithTag:tagNum]; 
    int value = [field intValue]; 

    return value; 
} 

我刪除了上述方法,並添加類別:

@implementation NSTextField(GetFieldValue) 
- (int)valueInTextField 
{ 
    NSTextField *field = [[[self window] contentView] viewWithTag:tagNum]; // DOESN'T LIKE THIS!! 
    return [self intValue]; 
} 
@end 

然而,不喜歡我要求它使用[[self window] contentView]去查找textField本身,所以唯一可以讓它工作的方式是(明顯地)刪除違規行並傳遞如下內容:

if([[[[self window]contentView]viewWithTag:ctr] valueInTextField] != 0) 

我相信你可以看到我想在這裏實現的目標。有沒有什麼辦法可以讓我的類別識別上面暗示的必填字段 - 即不必親自傳遞它?在此先感謝:-)

回答

2

如果你發現自己需要用於很多窗口或窗口控制器的方法,那麼將你的類別放在其中一個類中的正確位置。例如:

@implementation NSWindow(GetFieldValue) 
- (int)valueInTextFieldWithTag:(int)tag 
{ 
    NSTextField *field = [[self contentView] viewWithTag:tag]; 
    return [field intValue]; 
} 
@end 
+0

謝謝,smorgan。這正是我所期待的:-)欣賞你的輸入! – Bender 2010-03-08 04:29:09

2

但是,它不喜歡我問它 去找使用 文本字段本身[自我窗口]內容查看]

你添加一個- (int)valueInTextField方法每個NSTextField通過類別。
由於valueInTextField是一個實例方法,您已經需要一個textfield對象來調用它。
在文本字段本身內搜索文本字段沒有任何意義。 (雞和蛋的困境)

- (int)valueInTextField 
{ 
    NSTextField *field = [[[self window] contentView] viewWithTag:tagNum]; // DOESN'T LIKE THIS!! 
    return [self intValue]; 
} 

如上所述,這裏搜索的文本字段因爲你已經在文本框將無法正常工作。
除此之外,您還沒有在這裏使用字段變量。

你有多少個文本框?
也許用Ivars和網點管理你的文本域會比較容易,而不是通過標籤來搜索它們。

+0

謝謝,weichsel。對於新手來說,實際上「在一個textField /字符串/任何內部」的概念,以及編寫分類時所需的微妙代碼差異(與'普通'方法相對)需要一點時間適應,但我認爲我'現在已經得到了這個...至於文本字段的數量,我有兩個類,每個詢問九個單獨的字段,所以我發現'標記'方法對於通過簡單的for循環來循環有用。感謝您的寶貴解釋:-) – Bender 2010-03-08 04:44:50