2010-03-07 67 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