我有一个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
返回一个值。
答案 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
返回一些东西。这可能看起来更像代码,但不会限制模型类的可重用性。