Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 发送';自我';对一个物体_Objective C_Cocoa - Fatal编程技术网

Objective c 发送';自我';对一个物体

Objective c 发送';自我';对一个物体,objective-c,cocoa,Objective C,Cocoa,我有一个IBOutlet和一个IBAction连接到一个AppController类。 单击按钮时,它会创建另一个类(CData)的实例,其中包含一条用于计算字符串的消息。我的问题是,我希望可以从CData对象中访问IBOutlet 我通过在消息中包含self解决了这个问题,并在AppController中创建了一个IBOutlet的更新方法 - (IBAction)buttonClicked:(id)sender { CData *myData = [[CData alloc] init];

我有一个IBOutlet和一个IBAction连接到一个AppController类。 单击按钮时,它会创建另一个类(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返回一个值。

我不会用这种方式解决问题

如果
CData
类必须以某种方式更新视图,那么您应该在
iAction
方法中进行更新,或者将其视为MVC模式中的模型类,并让它生成视图可以观察到的
nsnotification

前一种方法最简单:

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

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

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

如果
CData
类必须以某种方式更新视图,那么您应该在
iAction
方法中进行更新,或者将其视为MVC模式中的模型类,并让它生成视图可以观察到的
nsnotification

前一种方法最简单:

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

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

如果我们要遵循MVC体系结构,而Cocoa Touch是这样做的,那么模型层应该完全从视图层抽象出来。在这种情况下,让您的CData类访问IBOutlet违反了这一原则——假设CData是模型类型的类。

正如您所说,一种方法是从
-calculateString
返回一些内容。这看起来像是更多的代码,但并不限制模型类的可重用性。

如果我们遵循MVC体系结构,而Cocoa Touch则遵循,那么模型层应该完全从视图层抽象出来。在这种情况下,让您的CData类访问IBOutlet违反了这一原则——假设CData是模型类型的类。

正如您所说,一种方法是从
-calculateString
返回一些内容。这看起来像是更多的代码,但并不限制模型类的可重用性。

Hmm,因为我想在单独的线程中运行一些计算,而不是立即打印。通知将是实现这一目标的方法。谢谢。就我个人而言,我觉得通知只适用于影响代码中多个层和对象的事件。如果是一个延迟的计算,或者是一个简单的回调,委托通常更合适:嗯,因为我想在一个单独的线程中运行一些计算,而不是立即打印。通知将是实现这一目标的方法。谢谢。就我个人而言,我觉得通知只适用于影响代码中多个层和对象的事件。如果是延迟的计算或简单的回调,委托通常更合适:他这样做的方式是,给控制器提供CData访问权,而不是视图。IMO,问题是他正在向控制器传递指针。因此,从技术上讲,CData可以通过指针访问视图类。避免向不同层的类传递指针是MVC的核心。他这样做的方式是,他向控制器而不是视图提供CData访问。IMO,问题是他正在向控制器传递指针。因此,从技术上讲,CData可以通过指针访问视图类。避免向不同层的类传递指针是MVC的全部内容。