从NSTextField类别中访问视图?

时间:2010-03-07 08:03:27

标签: objective-c cocoa categories 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 个答案:

答案 0 :(得分:2)

  

然而,它不喜欢我这么想   去找找textField本身   [[自我窗口] contentView]

您为每个- (int)valueInTextField类别添加了NSTextField方法 由于valueInTextField是一个实例方法,因此您需要一个textfield对象来调用它 在文本域中搜索文本字段没有任何意义。 (鸡和蛋的困境)

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

如上所述,在此处搜索文本字段将不起作用,因为您已经在文本字段中 除此之外,你还没有在这里使用字段变量。

你有多少文本字段?
也许用ivars和outlet来管理你的文本域更容易,而不是用标签来搜索它们。

答案 1 :(得分:2)

如果你发现自己需要很多窗口或窗口控制器的方法,那么放置类别的正确位置就是其中一个类。例如:

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