将'self'发送给对象

时间:2010-12-10 04:42:14

标签: objective-c cocoa

我有一个IBOutlet和一个连接到AppController类的IBAction。 单击一个按钮时,它会创建另一个类(CData)的实例,并带有一条消息来计算字符串。我的问题是我希望从CData对象中可以访问IBOutlet。

我通过在消息中包含self并在AppController中为IBOutlet创建了一个更新方法来解决它。

- (IBAction)buttonClicked:(id)sender
{
CData *myData = [[CData alloc] init];
[myData calculateString:self];
[myData release];
}

calculateString我完成了以下内容:

- (void)calculateString:(id)parent
{
   [parent updateTextLog:@"Print data..."];
}

它就像一个魅力。 但我的问题是,当我试图熟悉Obj-C和Cocoa时,如果这是一个解决问题的好方法,或者是否有另一种方式?

这只是一个概念证明,因为我非常清楚我可以让calculateString返回一个值。

2 个答案:

答案 0 :(得分:3)

我不会以这种方式解决问题。

如果CData类必须以某种方式更新视图,那么您应该在IBAction方法中执行此操作,或者将其视为MVC模式中的Model类,并使用它生成视图可以观察到的NSNotifcation

前一种方式最简单:

- (IBAction)buttonClicked:(id)sender
{
    CData *myData = [[CData alloc] init];
    ReturnValueType someReturnValue = [myData calculateString:self];
    [someObject someMethod:someReturnValue];
    [myData release];
}

这减少了耦合,因为CData(Model)类不需要知道任何视图或控制器的存在。

答案 1 :(得分:1)

如果我们要遵循MVC架构,而Cocoa Touch就是这样,那么模型层应该完全从视图层中抽象出来。在这种情况下,让您的CData类访问IBOutlet违反了这一原则 - 假设CData是模型类。 就像你说的那样,解决它的一种方法是从-calculateString返回一些东西。这可能看起来更像代码,但不会限制模型类的可重用性。